分离对象中的Hibernate延迟加载

19

我创建了一个类,在其中设置了一些字段(其他实体)为LAZY加载。现在,当这个对象已经从会话中分离出来后,我需要使用它,所以我显然需要确保在将其分离之前,所有我需要的字段都被填充好了。我尝试过只调用这些懒加载字段的getters方法,但似乎没有起作用。有人知道如何强制加载这些字段吗?


你确定在调用 getters 时你的会话已经打开了吗? - jmj
当我调用getter函数时,会话肯定是打开的。 - Clinton Bosch
4个回答

14
Hibernate.initialize(yourObject)

调用该方法会强制初始化传递给它的对象/集合。这需要一个活动会话。

如果实体已经分离,您需要将对象(使用merge(..))重新附加到活动会话中,然后再将其初始化。


1
merge 只适用于某些非常特殊的情况。作为一个经验法则,我建议使用 update - pakore
@pakore - 我认为区别在于merge(..)可以插入新记录。但是我更习惯JPA的语义,所以这里可能有点不同。 - Bozho
2
我认为Hibernate.initialize不是可传递的。因此,如果您的对象具有延迟集合或延迟字段,则需要执行Hibernate.initialize(object.getLazyField())或.initialize(object.getLazyCollection())。 - Barthelemy

3
您可以将其重新附加到会话中。这是正常的方式。
session.update(yourObject); //This reattachs the object to the current session.
yourObject.someGetter(); //This will work now.

2
<prop key="hibernate.enable_lazy_load_no_trans">true</prop> 

你可以将以下代码添加到你的配置文件中,它可以获取你的懒加载对象即使它已经被分离,但是需要使用4.1.7版本以上,因为之前的版本存在连接泄漏问题。详情请参见此处


1

我知道你要求使用Hibernate,但是EclipseLink也有这个功能,如果你正在使用JPA而且没有绑定到特定的实现,那么检查一下它可能是值得的。不过,迁移到EclipseLink时你可能会遇到其他问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接