簡體   English   中英

Hibernate JPA - 沒有填充ManyToOne關系

[英]Hibernate JPA - ManyToOne relationship not populated

我目前正在將一個(工作)應用程序從使用EclipseLink轉移到Hibernate JPA,大多數情況下它已經非常順利,但我找到了一件我無法解釋的事情,也無法想到任何好的搜索術語!

基本上,我有四個實體,一對多的關系形成一個鏈:

EntityA有一個EntityB列表,每個列表都有一個EntityC列表,每個列表都包含一個EntityD列表

然后,每個人都有一個多對一的關系,所以:

EntityD有一個EntityC,它有一個EntityB,它有一個EntityA。

那是(為了清晰起見而大大減少):

@Entity
public class EntityA {
  @OneToMany (cascade = CascadeType.All, mappedBy = "entityA")
  private List<EntityB> entityBList;
  ...
}

@Entity
public class EntityB {
  @OneToMany (cascade = CascadeType.All, mappedBy = "entityB")
  private List<EntityC> entityCList;

  @JoinColumn (name = "ENTITY_A", referencedColumnName = "ENTITY_A_ID")
  @ManyToOne (cascade = CascadeType.PERSIST, optional = false)
  private EntityA entityA;
}

@Entity
public class EntityC {
  @OneToMany (cascade = CascadeType.ALL, mappedBy = "entityC")
  private List<EntityD> entityDList;

  @JoinColumn (name = "ENTITY_B", referencedColumnName = "ENTITY_B_ID")
  @ManyToOne (cascade = CascadeType.PERSIST, optional = false)
  private EntityB entityB;
}

@Entity
public class EntityD {
  @JoinColumn (name = "ENTITY_C", referencedColumnName = "ENTITY_C_ID")
  @ManyToOne (cascade = CascadeType.PERSIST, optional = false)
  private EntityC entityC;
}

我從數據庫中獲取一個EntityA(通過其主鍵查找),從而得到一個填充良好的EntityA實例,我的List<EntityB>具有PersistentBag。 當我取消引用List<EntityB> ,我看到發生了延遲加載,並且從EntityB獲取EntityC也是如此。

在這一點上,一切都如我所料,我有一個EntityA,B和C都完全填充了數據庫中的值,但后來我嘗試從EntityC獲取我的EntityD,並發現它是null。

我的實體管理器此時仍處於打開和活動狀態,即使我在獲得EntityA后立即在調試器中查看它,我也可以遍歷關系,直到EntityC,並再次將'entityDList'視為null。

到目前為止我找到的唯一解決方案是使用:

EntityManager.refresh(entityC);

它填充所有元素,包括一個延遲加載的實體DLL的PersistentBag。

所以,我的猜測是Hibernate只填充2級深度的參考(或3,取決於你的計算方式),然后放棄,盡管我不明白為什么會這樣。 這對任何人都有意義嗎?

除了.refresh之外還有其他解決方案嗎? 某種配置或注釋值會使Hibernate一直填充引用?

感謝這里的人們的建議,這可能是相關的,但對我的具體案例沒有幫助。

如果您正在閱讀本文遇到同樣的問題,可能值得嘗試max_fetch_depth建議,但由於某種原因它不適合我(我喜歡建議為什么?)。

同樣地,如果你的@OneToMany是集合,而不是列表,做一個急切的提取或左連接,正如Albert所建議的那樣可能有效,但顯然Hibernate只允許你最多有1個急切獲取的List,如果你需要的話更重要的是,您的館藏應該是集合。 我沒有嘗試過,但我懷疑它可能已經解決了這個問題。

除非有人有更好的建議,否則我會堅持使用調用刷新,這實際上可能對我的應用程序更有意義。

這確實很有趣。 解決它的一種方法是查詢對象A左連接 - 獲取 - > B-> C-> D,如果你要遍歷到對象D,也會更快。 這將是這樣的。

"from A left join fetch B left join fetch C left join fetch D"

你是否也試過從C-> D渴望建立關系? 好奇會發生什么......

hibernate文檔說你可以用hibernate.max_fetch_depth屬性設置它。 默認值為3.您可以在第47頁的“Hibernate參考文檔”中找到它。

暫無
暫無

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

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