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