[英]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.