我创建了一个类,在其中设置了一些字段(其他实体)为LAZY加载。现在,当这个对象已经从会话中分离出来后,我需要使用它,所以我显然需要确保在将其分离之前,所有我需要的字段都被填充好了。我尝试过只调用这些懒加载字段的getters方法,但似乎没有起作用。有人知道如何强制加载这些字段吗?
我创建了一个类,在其中设置了一些字段(其他实体)为LAZY加载。现在,当这个对象已经从会话中分离出来后,我需要使用它,所以我显然需要确保在将其分离之前,所有我需要的字段都被填充好了。我尝试过只调用这些懒加载字段的getters方法,但似乎没有起作用。有人知道如何强制加载这些字段吗?
Hibernate.initialize(yourObject)
调用该方法会强制初始化传递给它的对象/集合。这需要一个活动会话。
如果实体已经分离,您需要将对象(使用merge(..)
)重新附加到活动会话中,然后再将其初始化。
merge
只适用于某些非常特殊的情况。作为一个经验法则,我建议使用 update
。 - pakoremerge(..)
可以插入新记录。但是我更习惯JPA的语义,所以这里可能有点不同。 - Bozhosession.update(yourObject); //This reattachs the object to the current session.
yourObject.someGetter(); //This will work now.
<prop key="hibernate.enable_lazy_load_no_trans">true</prop>
你可以将以下代码添加到你的配置文件中,它可以获取你的懒加载对象即使它已经被分离,但是需要使用4.1.7版本以上,因为之前的版本存在连接泄漏问题。详情请参见此处
我知道你要求使用Hibernate,但是EclipseLink也有这个功能,如果你正在使用JPA而且没有绑定到特定的实现,那么检查一下它可能是值得的。不过,迁移到EclipseLink时你可能会遇到其他问题。