我目前正在将使用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