论坛首页 Java版 Hibernate

关于Hibernate的继承关系映射

浏览 1411 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
时间:2005-02-05
HIbernate作为ORM 实现,对类继承树提供了很好的支持,但是它提供的三种实现方式我感觉都不是很满意。
1)每个concrete类一个表 ,不支持多态关联和查询。
虽然这个我们用得最普遍,但是它却没有提供多态的支持。

2)每个类继承树一个表 ,这会造成表结构非常难看,而且许多字段必须强制允许空值。

3 )每个subClass一个表,缺点是表结构比较分散,性能比较差。 可以通过一个视图来弥补表结构的差异。 比如left out join... 。

一般来说,如果需要支持多态关联的话,那么3)无疑是现有方案中比较值得选择的一种方案,但是对于分散的表结构很多人还是不尽满意,如果数据库不支持视图的话,那么对于直接要从数据库底层进行相应维护工作的人来说,看到这种支离破碎的表结构然如噩梦。

最近看到一个这样的数据模型,里面提到一种方案:

party(表名)
id
name
information_id(外键)
information_table_name(具体关联的表名)
...

这里Information被设计成一个虚拟的超类,它下面有多个子类比如AddressInformation , ProfileInformation等等
而那个information_table_name就作为具体的关联的表名的一个discriminator key出现。
显然,这种方法如果可以用在ORM的实现上,它的好处是不仅实现了多态关联,而且保持了很好的表结构。 但是坏处同样是查询性能比较差。
可以假设一个模拟的hibernate 实现

[code:1] <class
name="Party"
table="party"
dynamic-update="true"
dynamic-insert="false"
discriminator-value="null"
>
<many-to-one
name="information"
class="Information"

cascade="none"
outer-join="auto"
update="true"
insert="true"
access="property"
column="INFORMATION_ID"
>
[color=red] <discriminator-column [/color] column="information_table_name" />

</many-to-one>
.....
</class>
<class
name="Information"

abstract="true"
>
<property name="...."
/>
.......
<sub-class name="AddressInformation"
table="AddressInformation"
...... ...............
</sub-class>
<sub-class name="ProfileInformation"
table="ProfileInformation"
....
</sub-class>

</class>


[/code:1]
在保存的时候,hibernate根据具体类的class找到对应的tablename,设置information_table_name的值并保存,取值得时候,根据information_table_name找出对应的具体class,并到对应的表查询数据。
值得注意的是,information_id 可以重复,比如可以有两个1,但是因为information-table-name的不同,他们分别关联到具体的表上。
   
论坛首页 Java版 Hibernate

跳转论坛:
JavaEye推荐