我有以下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个表:
据我所知,在这种情况下,需要在调用.save()之前显式生成id,所以我的问题是:我如何创建一个自动生成id的策略,以便来自的id具体类在连接时形成一个连续的域。
答案 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的表;每次用户想要插入新实体时,都应修改此值。通过这种方式,域是连续的