2009-03-03 122 views
0

对于我当前的项目,我必须使用休眠映射旧数据库,但我遇到了一些问题。 数据库使用一个“实体”表进行设置,该表包含所有域对象的公共属性。属性包括(除其他外)创建日期,所有者(用户)以及随后在表对象中使用的主键。传统的休眠映射

上下文的简单表示是这样的:

table entity 
- int id 
- varchar owner 

table account 
- int accountid (references entity.id) 

table contact 
- int contactid (references entity.id) 
- int accountid (references account.accountid) 

我的问题表现出自己,当我尝试集合映射添加到我的帐户映射,包含属于该帐户的所有联系人。我尝试归结为以下几点:

<hibernate-mapping> 
    <class name="Contact" table="entity"> 
     <id name="id" column="id"> 
      <generator class="native" /> 
     </id> 
     <join table="contact"> 
      <key column="contactid"/> 
      <!-- more stuff --> 
     </join> 
    </class> 
</hibernate-mapping> 

<hibernate-mapping> 
    <class name="Account" table="entity"> 
     <id name="id" column="id"> 
      <generator class="native" /> 
     </id> 


     <bag name="contacts" table="contact"> 
      <key column="accountid" /> 
      <one-to-many class="Contact"/> 
     </bag> 

     <join table="account"> 
      <key column="accountid"/> 
      <!-- more stuff --> 
     </join> 

    </class> 
</hibernate-mapping> 

然而,当我尝试获取我得到一个SQL错误的帐户,说明该实体表不包含一个名为ACCOUNTID列。我明白了为什么会发生这种情况:当我希望它在联系人表中查找时,映射会尝试在实体表中查找合适的列。我在这里错过了一些明显的东西,还是应该从另一个方向来解决这个问题?

回答

3

这对我来说就像你实际上需要使用Table Per Subclass范式映射继承一样。

事情是这样的:

<class name="entity" table="entity"> 
    <id name="id" column="id"> 
     ... 
    </id> 

    <joined-subclass name="contact" table="contact"> 
     <key column="contactid"/> 
    </joined-subclass> 

    <joined-subclass name="account" table="account"> 
     <key column="accountid"/> 
    </joined-subclass> 
</class> 

这是近似的方式 - 它的详细Hibernate文档的第9.1.2节中描述(以防万一你找不到它,这就是所谓的“表每子类“)。

干杯

丰富

+0

遗产继承部分全部ACK。 – boutta 2009-03-03 11:50:09