Sco*_*ott 1 java hibernate spring-mvc
我正在使用带有自定义FlashScope实现的vanilla Spring MVC.我们基本上使用它来遵循Post-Redirect-Get模式.
我遇到了一个奇怪的情况.在我的帖子中,我做了一些搜索用户输入的参数,并将这些实例设置到FlashScope上.我看到那些碎片工作正常.
在我放到FlashScope上的对象中,我有一个延迟加载的集合,但是当我尝试访问集合时,如下所示:
entity.getLazyLoadedCollection();
Run Code Online (Sandbox Code Playgroud)
我收到以下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)
Run Code Online (Sandbox Code Playgroud)
奇怪的是,就在上面的调用之前,我将它合并到我的服务层的会话中:
getSession().merge(entity);
Run Code Online (Sandbox Code Playgroud)
Hibernate Documentation声明如果我知道我正在使用新会话,我应该调用update,但是JavaDocs看起来我应该调用merge ...
作为一种解决方法,我已经完成了以下工作:
if (getSession().contains(entity)) {
getHibernateTemplate().merge(person);
} else {
getSession.update(entity);
}
Run Code Online (Sandbox Code Playgroud)
我该怎么办?
请仔细阅读您链接的javadoc:"返回持久化实例.如果给定实例未保存,请保存副本并将其作为新持久化实例返回.给定实例不会与会话关联."
无论您传递给merge(),该对象都不会与会话相关联.您需要使用merge()返回的对象.
| 归档时间: |
|
| 查看次数: |
2172 次 |
| 最近记录: |