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

3
我有以下的Hibernate映射,需要使用具体类层次结构表进行映射:
<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>

这意味着在数据库中只有两个表:
- house(id_property(PK),address,noOfRooms,totalArea,price) - land(id_property(PK),address,area,unitPrice)
据我所知,在这种情况下,需要在调用.save()之前显式生成ids,因此我的问题是:如何创建一个策略来自动生成ids,以便当连接时,具体类的ids形成连续域。
3个回答

3
在我看来,您在数据库中的模型存在问题,因为您在多个相关表之间有冗余信息。每个具体类对应一个表是一种继承模型,在运行时会出现问题,因为您可能会遇到这样的情况:当您更新Land的地址时,却没有更新House的地址,而它们在语义上是相同的。换句话说:放弃这种模型,引入以子类为表的模型,这样您就可以拥有一个基础属性表,其中包含id和地址,以及两个分别具有PK的独立表,其PK是指向基础属性表的FK,一个是带有特定房屋字段的房屋表,另一个是带有特定土地字段的土地表。
这将给您带来最少的问题,因为这是将实体类型间的继承转换为关系表的方法(请参见Nijssen/Halpin的关于NIAM/ORM的书籍)。

非常感谢,但不幸的是我无法更改数据库结构,因此我正在寻找Table per concrete class模型的解决方案。 - melculetz

1

我在使用joined-subclass时使用了以下内容

<key column="id"/>

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


你的解决方案适用于每个子类层次结构的表,但这不适用于我的情况,因为我只有两个表:房屋和土地。 - melculetz

0
解决方案是创建另一个表来存储下一个ID;每当用户想要插入新实体时,该值应进行修改。通过这种方式,域是连续的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接