簡體   English   中英

自引用 JPA 實體以滿足接口定義

[英]Self referencing JPA Entity to satisfy interface definition

我有一個 spring + Data JPA 設置,其中包含幾個從這樣的接口定義繼承的實體(在“偽”Java 中):

@Entity 
A implements WithSubProperty
@Id
Long Id
SubProperty subProperty
…

@Entity
B implements WithSubProperty
@Id
Long Id
SubProperty subProperty
…

Interface WithSubProperty
SubProperty subProperty
…

@Entity
SubProperty
@Id
Long Id
…

每個實體都有自己的表。 此外,還有幾個存儲庫片段使用接口定義(以便為兼容類只實現一次自定義邏輯),如下所示:

RepositoryFragment<WithSubProperty, K>
List<WithSubProperty> findAllWithSubProperty(SubProperty subProperty)
…

現在,我想以相同的方式處理實際的接口屬性 (SubProperty),而不必為這個單一實體復制和調整 RepositoryFragment 邏輯。 我嘗試了以下操作(在 SubProperty 上使用幾種不同的注釋(@OneToOne、@Transient、@Column、@JoinColumm、@Formula 及其組合):

@Entity    
SubProperty implements WithSubProperty
@Id
Long Id
@XXXAnnotations
SubProperty subProperty

一個想法是引用 id 列,基本上形成與自身的 OneToOne 關系。 到目前為止,我無法讓它工作。 乍一看,這種方法看起來有點笨拙,但除了可能(?)缺乏 JPA/Hibernate 的支持以及以遞歸結束的風險之外,應該沒有其他問題。 想法? 謝謝!

更新:這是一個最小(非)工作示例: https : //github.com/user462982/demoJPA/blob/master/src/main/java/com/example/demo/entities/SubProperty.java

對於上面的代碼可能造成的混亂,我深表歉意。 我的原始代碼在 Kotlin 中,我試圖將它從我的頭腦中轉換為 Java,而沒有預測/考慮樣板 Java 的真正含義(例如,Java 中沒有接口屬性)...希望工作示例現在更清楚. 它在啟動時創建相同的異常,所以我假設(字節)代碼是等效的。

最后我找到了一個解決方案: https : //github.com/user462982/selfReferencingJPAEntity/blob/master/src/main/kotlin/ex/ample/selfreferencing/entites/Property.kt (這次在 Kotlin 中,因為 Java 是皮塔餅太多了......)。

基本上

@OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "id")

     @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumn(name = "id", insertable=false, updatable =false)

就夠了:

@Entity class Property : WithProperty {

@Id
@GeneratedValue
val id: Long? = null

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "id", insertable=false, updatable =false)
override val property: Property? = null

理解這個問題的一個很好的起點是測試: https : //github.com/user462982/selfReferencingJPAEntity/blob/master/src/test/kotlin/ex/ample/selfreferencing/repositories/RepositoriesTest.kt

該測試還揭示了 org.hibernate.loader.hql.QueryLoader 中的一個錯誤,如果一個參數在具有上述自引用實體的查詢中出現不止一次,它似乎會感到困惑。 休眠問題是由@OneToOne 關聯引起的,可以使用上面的@ManyToOne 來解決。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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