[英]Hibernate - Which inheritance strategy should I use for a class which isn't abstract, but sub-classes may not need tables
[英]Inheritance strategy in Hibernate: making an entity abstract and replacing with sub classes
我目前有數據庫和休眠映射。 有一個中央表和相應的實體( PersistentObject
)。 許多其他表和實體通過@ManyToOne
或@OneToOne
映射引用PersistentObject
。
現在,我想使當前的PersistentObject
的抽象和引進兩個子類Sub1Object
和Sub2Object
從繼承PeristentObject
。
我不能更改存儲PersistentObject
的表,否則可以添加新表等。 該表包含足夠的信息,因此我可以根據需要使用@DiscriminatorColumn
分隔Sub1Object
和Sub2Object
行。
是否可以進行此更改,以使我當前的HQL查詢無需修改就可以正常工作? 我有很多類似from PersistentObject where foo = ?
的查詢from PersistentObject where foo = ?
並from OtherEntity other where other.persistentObject = ?
。 我希望這些查詢開始返回具體的子類而不是超類。 我不想為Sub1Object
和Sub2Object
編寫單獨的查詢。
這是可能嗎? 我應該使用哪種繼承策略?
我不能更改存儲
PersistentObject
的表,否則可以添加新表等。 該表包含足夠的信息,因此我可以根據需要使用@DiscriminatorColumn
分隔Sub1Object
和Sub2Object
行。
您可以使用JOINED
繼承策略(帶有或不帶有標識符)。 對於頂級階層:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "DISC")
public abstract PersistentObject {
@Id @GeneratedValue
private Long id;
...
}
例如:
@Entity
public class Sub1Object extends PersistentObject {
...
}
這不會更改現有表。
是否可以進行更改,以使我當前的HQL查詢仍然可以正常工作而無需修改? 我有很多類似
from PersistentObject where foo = ?
的查詢from PersistentObject where foo = ?
並from OtherEntity other where other.persistentObject = ?
。 我希望這些查詢開始返回具體的子類而不是超類。
它們將起作用並返回擴展該類的所有持久類的實例。
您必須使用每個類表的層次結構策略,因為您要使用鑒別符列:)就我而言,休眠應該可以與您描述的內容一起使用而沒有任何問題。 將子類映射為可識別hiberante的類並提供適當的區分符就足夠了。
只是警告一下,有時instanceof指令將不起作用,因為您將獲得代理對象,但是可以使用Hibernate.getClass(Obj ...)進行檢查。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.