浏览 1411 次
|
锁定老贴子 主题:关于Hibernate的继承关系映射
精华帖 (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的不同,他们分别关联到具体的表上。 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |



