我目前有数据库和休眠映射。有一个中央表和相应的实体(PersistentObject
)。其他许多表和实体通过PersistentObject
或@ManyToOne
映射引用@OneToOne
。
现在,我想使当前的PersistentObject
抽象,并引入两个从Sub1Object
继承的子类Sub2Object
和PeristentObject
。
我无法更改存储PersistentObject
的表,否则可以添加新表等。该表包含足够的信息,因此我可以根据需要使用例如@DiscriminatorColumn
分隔Sub1Object
和Sub2Object
行。
是否可以进行此更改,以使我当前的HQL查询无需修改就可以正常工作?我有很多查询,例如from PersistentObject where foo = ?
和from OtherEntity other where other.persistentObject = ?
。我希望这些查询开始返回具体的子类而不是超类。我不想为Sub1Object
和Sub2Object
编写单独的查询。
这是可能吗?我应该使用哪种继承策略?
最佳答案
您必须使用每个类的表层次结构策略,因为您要使用鉴别符列:)
对于我来说,休眠应该可以与您所描述的完全一样。将子类映射为可识别hiberante的类并提供适当的区分符就足够了。
只是警告一下,有时instanceof指令将不起作用,因为您将获得代理对象,但是可以使用Hibernate.getClass(Obj ...)进行检查。