Hibernate中每个具体类层次结构的表

时间:2009-01-04 07:47:26

标签: hibernate class-hierarchy

我有以下Hibernate Mapping,必须使用Table per Concrete Class Hierarchy进行映射:

<hibernate-mapping package='dao'>
    <meta attribute='class-description'></meta>
    <class name='PropertyDAO'>
        <id name='id' column='id_property'>
            <generator class='assigned'/>
        </id>
        <property name='address' column='address' type='string'/>
        <union-subclass name='HouseDAO' table='house'>
            <property name='noOfRooms' column='noOfRooms'/>
            <property name='totalArea' column='totalArea'/>
            <property name='price' column='price'/>
        </union-subclass>
        <union-subclass name='LandDAO' table='land'>
            <property name='area' column='area'/>
            <property name='unitPrice' column='unitPrice'/>
        </union-subclass>
    </class>
</hibernate-mapping>

这意味着在数据库中我只有2个表:

  • house(id_property(PK),address,noOfRooms,totalArea,price)
  • land(id_property(PK),address,area,unitPrice)

据我所知,在这种情况下,需要在调用.save()之前显式生成id,所以我的问题是:我如何创建一个自动生成id的策略,以便来自的id具体类在连接时形成一个连续的域。

3 个答案:

答案 0 :(得分:3)

恕我直言,您在数据库中的模型是错误的,因为您在多个表中有相关​​的冗余信息。

每个具体类的表是一个继承模型,它在运行时给出问题,因为你可以有一个更新Land的地址而不是House的地址,而它们是相同的(语义上)。 Iow:删除这个模型并引入table-per-subclass,所以你有一个带id和地址的属性基表和两个带PK的分隔表,它是属性库pk的FK,一个是房子特定字段的房子,另一个是具有土地特定领域的土地。

这将为您提供最少数量的问题,因为它是将实体类型之间的继承转换为关系表的方式(参见Nijssen / Halpin关于NIAM / ORM的书籍)

答案 1 :(得分:1)

我在join-subclass

中使用了以下内容
<key column="id"/>

这应该使子类使用属性表中的id,因为它依赖于它。 (超级)列引用子类中的列,它是对super的外部引用。

答案 2 :(得分:0)

解决方案是创建另一个存储下一个id的表;每次用户想要插入新实体时,都应修改此值。通过这种方式,域是连续的