合并后Hibernate延迟加载错误

时间:2011-07-28 14:32:19

标签: java hibernate spring-mvc

我正在使用带有自定义FlashScope实现的vanilla Spring MVC。我们基本上使用它来遵循Post-Redirect-Get模式。

我遇到了一个奇怪的情况。在我的帖子中,我做了一些搜索用户输入的参数,并将这些实例设置到FlashScope上。我看到那些碎片工作正常。

在我放置在FlashScope上的对象中,我有一个延迟加载的集合,但是当我尝试访问该集合时是这样的:

entity.getLazyLoadedCollection();

我收到以下stacktrace:

ERROR org.hibernate.LazyInitializationException IP127.0.0.1 CV#4c44559c-c576-4732 P#75004 - could not initialize proxy - no Session
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:167)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:215)
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190)
at core.model.entities.WorkflowState_$$_javassist_36.getFunctions(WorkflowState_$$_javassist_36.java)

奇怪的是,就在上面的调用之前,我将它合并到我服务层的会话中:

getSession().merge(entity);

Hibernate Documentation声明如果我知道我正在使用新会话,我应该调用更新,但JavaDocs使我觉得应该调用merge ...

作为一种解决方法,我已完成以下工作:

if (getSession().contains(entity)) {
    getHibernateTemplate().merge(person);
} else {
    getSession.update(entity);
}

我应该在这做什么?

2 个答案:

答案 0 :(得分:5)

仔细阅读您链接的javadoc:“返回持久化实例。如果给定实例未保存,请保存副本并将其作为新持久化实例返回。给定实例不会与会话关联。”< / p>

无论您传递给merge(),该对象都不会与会话相关联。您需要使用merge()返回的对象。

答案 1 :(得分:0)

从未使用过FlashScope,但是您的错误是因为您尝试访问尚未初始化的LAZY集合,并且您不再处于可以访问Hibernate的应用层中Session。如果该假设是正确的,则需要初始化您可以访问Session的集合(例如,您的DAO)。以下是两种基本方式:

Hibernate.initialize(object.getMyLazyCollection());

if(object.getMyLazyCollection() != null) {
   object.getMyLazyCollection().size(); // forces a collection load
}