Java Hibernate JPA-未填充多通关系

Java Hibernate JPA-未填充多通关系,java,hibernate,orm,jpa,lazy-loading,Java,Hibernate,Orm,Jpa,Lazy Loading,我目前正在将一个(工作)应用程序从使用EclipseLink迁移到Hibernate JPA,大多数情况下进展相当顺利,但我发现一件事我无法解释,也无法想出任何好的搜索词 基本上,我有四个实体,一对多的关系形成一个链: EntityA有一个EntityB的列表,每个都有一个EntityC的列表,每个都有一个EntityD的列表 然后,每一种都有一种多对一的关系,因此: EntityD有一个EntityC,它有一个EntityB,它有一个EntityA 即(为清晰起见,大幅降低): 它填充其所有元

我目前正在将一个(工作)应用程序从使用EclipseLink迁移到Hibernate JPA,大多数情况下进展相当顺利,但我发现一件事我无法解释,也无法想出任何好的搜索词

基本上,我有四个实体,一对多的关系形成一个链:

EntityA有一个EntityB的列表,每个都有一个EntityC的列表,每个都有一个EntityD的列表

然后,每一种都有一种多对一的关系,因此:

EntityD有一个EntityC,它有一个EntityB,它有一个EntityA

即(为清晰起见,大幅降低):

它填充其所有元素,包括entityDList的延迟加载PersistentBag

所以,我的猜测是Hibernate只填充了2层深度的引用(或者3层,取决于你如何计算),然后放弃,尽管我真的不明白为什么会这样。这对任何人都有意义吗


除了.refresh之外,还有其他解决方案吗?某种配置或注释值将使Hibernate一直填充引用?

这确实很有趣。解决此问题的一种方法是查询对象A左连接,将其获取到->B->C->D,如果要向下遍历到对象D,这也会更快。 应该是这样的

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

你是否也尝试过让C->D的关系变得更迫切?好奇接下来会发生什么…

hibernate文档说您可以使用hibernate.max\u fetch\u depth属性设置它。默认值为3。您可以在第47页的中找到它。

感谢这里的人的建议,这些建议可能是相关的,但对我的具体案例没有帮助

如果你在读这篇文章时遇到了同样的问题,那么可能值得尝试一下
max\u fetch\u depth
建议,但由于某种原因,它对我不起作用(我想知道为什么?)

类似地,如果您的
@OneToMany
是集合,而不是列表,那么按照Albert的建议执行一个急取或左连接可能会起作用,但显然Hibernate只允许您最多有一个急取的列表,如果您需要更多,则应该设置集合。我没有试过,但我怀疑它可能解决了这个问题


除非有人有更好的建议,否则我将坚持调用refresh,这实际上对我的应用程序来说可能更有意义。

谢谢-你知道hibernate JPA是否也使用hibernate.properties文件,我在hibernate文档中找不到答案吗?我尝试将其更改为4和0,但似乎没有任何效果…好吧,忽略上面的内容,它确实似乎正在使用,因为将max_fetch_depth设置为0会破坏我应用程序的其他部分:)但将其设置为高数字(我尝试了4和10),似乎没有任何效果;我猜是因为这只是一个最大值,还有其他一些东西正在说服Hibernate在3个级别停止…?谢谢Albert,我尝试了两个建议,但都没有效果:(让关系变得急切没有效果,所以我尝试了让所有3个关系(a->B->C->D)都变得急切,但Hibernate抱怨“无法同时获取多个包”。将左连接添加到JPQL得到了相同的结果。我在其他地方发现了一些东西,表明这是因为我急切地获取的集合是列表,如果我将它们设置为集合,它将起作用,但我现在太懒了,所以我想我只能忍受一个刷新调用!hibernate配置参数的值设置是多少呃“最大深度”?
EntityManager.refresh(entityC);
"from A left join fetch B left join fetch C left join fetch D"