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

我遇到了一个奇怪的情况。在我的文章中,我搜索了用户输入的参数,并将这些实例设置到FlashScope上。我看到这些作品效果很好。

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

entity.getLazyLoadedCollection();


我收到以下堆栈跟踪:

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指出如果我知道我正在处理新的会话,则应该调用update,但是JavaDocs使其看起来像我应该调用merge...。

作为解决方法,我已完成以下操作:

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


我在这里应该做什么?

最佳答案

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

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

09-27 11:19