簡體   English   中英

Hibernate中的繼承策略:使實體抽象並替換為子類

[英]Inheritance strategy in Hibernate: making an entity abstract and replacing with sub classes

我目前有數據庫和休眠映射。 有一個中央表和相應的實體( PersistentObject )。 許多其他表和實體通過@ManyToOne@OneToOne映射引用PersistentObject

現在,我想使當前的PersistentObject的抽象和引進兩個子類Sub1ObjectSub2Object從繼承PeristentObject

我不能更改存儲PersistentObject的表,否則可以添加新表等。 該表包含足夠的信息,因此我可以根據需要使用@DiscriminatorColumn分隔Sub1ObjectSub2Object行。

是否可以進行此更改,以使我當前的HQL查詢無需修改就可以正常工作? 我有很多類似from PersistentObject where foo = ?的查詢from PersistentObject where foo = ? from OtherEntity other where other.persistentObject = ? 我希望這些查詢開始返回具體的子類而不是超類。 我不想為Sub1ObjectSub2Object編寫單獨的查詢。

這是可能嗎? 我應該使用哪種繼承策略?

我不能更改存儲PersistentObject的表,否則可以添加新表等。 該表包含足夠的信息,因此我可以根據需要使用@DiscriminatorColumn分隔Sub1ObjectSub2Object行。

您可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM