我目前正在將使用EclipseLink的(工作)應用程序從使用EclipseLink遷移到Hibernate JPA,大部分情況非常順利,但我找到了一件我無法解釋的事情,並且還可以沒有想到任何好的搜索條件!休眠JPA - ManyToOne關係未填充
基本上,我有四個實體,有一個一對多的關係,形成了產業鏈:
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例如,用PersistentBag爲我的List<EntityB>
。當我解引用List<EntityB>
時,我看到一個懶惰的負載發生,並且從EntityB獲取EntityC時重複相同。
在這一點上,一切都如我所料,我有一個EntityA,B和C全部用數據庫中的值填充,但是然後我嘗試從EntityC中獲得我的EntityD,並發現它爲空。
我的實體管理器在這一點上仍然是開放和活躍的,即使我在獲得EntityA後立即在調試器中查看它,我可以遍歷關係,直至EntityC,並再次查看'entityDList '爲空。
我到目前爲止發現的唯一的解決辦法是使用:
EntityManager.refresh(entityC);
其中填充的所有元素,包括一個懶洋洋地加載PersistentBag爲entityDList。因此,我的猜測是,Hibernate只填充參考2級深(或3,取決於你如何計數),並放棄後,雖然我不明白爲什麼會這樣。這對任何人都有意義嗎?
除了.refresh之外,還有其他解決方案嗎?某種配置或註釋值會使Hibernate一直向下填充引用?
爲hibernate配置參數「max_fetch_depth」設置了什麼值? – 2010-07-06 14:48:10