对于我当前的项目,我必须使用hibernate映射遗留数据库,但我遇到了一些问题。 使用一个“实体”表设置数据库,该表包含所有域对象的公共属性。属性包括(以及其他)创建日期,所有者(用户)和主键,随后在域对象的表中使用。
上下文的简单表示是这样的:
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的列。我明白为什么会发生这种情况:当我希望它在联系表中查找时,映射会尝试在实体表中找到accountid列。我在这里遗漏了一些明显的东西,还是应该从另一个方向处理这个问题?
答案 0 :(得分: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节中有详细描述(以防你找不到它,它被称为“每个子类的表”)。
干杯
富