3

我有以下休眠映射,必须使用每个具体类层次结构的表进行映射:

<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 个表:

  • 房子(id_property(PK),地址,noOfRooms,totalArea,价格)
  • 土地(id_property(PK),地址,面积,单价)

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

4

3 回答 3

3

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

每个具体类的表是一种继承模型,它在运行时会出现问题,因为您可能会遇到这样的情况:当它们相同(语义上)时更新 Land 的地址而不是 House 的地址。Iow:删除此模型并引入每个子类的表,因此您有一个带有 id 和地址的属性基表和两个带有 PK 的分隔表,PK 是属性基础 pk 的 FK,一个是带有房屋特定字段的房屋,另一个是具有土地特定领域的土地。

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

于 2009-01-04T11:03:21.850 回答
1

我将以下内容与joined-subclass一起使用

<key column="id"/>

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

于 2009-01-04T08:01:25.227 回答
0

The solution is to create another table that stores the next id; this value should be modified each time a user wants to insert a new entity. In this way, the domain is continuous

于 2009-01-29T21:02:54.213 回答