我正在使用Spring MVC框架和Hibernate。我的所有控制器都使用OpenSessionInViewInterceptor。
我在控制器的onSubmit()方法中得到“无法初始化代理 - 拥有会话已关闭”错误。我相信这是因为Hibernate需要返回数据库来获取作为代理检索的某些对象,而OpenSessionInViewInterceptor已经关闭了会话。
我一直在解决这些问题,方法是在对象上使用HibernateTemplate()。reattach()。
我的问题是:
a)我的诊断是对的吗? 和b)有没有更好的方法来重新打开Hibernate会话?有没有办法在没有reattach()的情况下以编程方式重新打开Hibernate中的会话?
编辑:堆栈跟踪如下:当我在提交方法中迭代Set时,我收到错误
Data access failure: failed to lazily initialize a collection of role: com.companyname.apps.manager.domain.PriceChangeset.priceChanges, no session or session was closed
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.companyname.apps.manager.domain.PriceChangeset.priceChanges, no session or session was closed
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:358)
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:350)
at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:343)
at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:86)
at org.hibernate.collection.PersistentSet.iterator(PersistentSet.java:163)
**at com.companyname.apps.manager.service.impl.PriceChangesetServiceImpl.addChangesToSqlTransfer(PriceChangesetServiceImpl.java:263)
at com.companyname.apps.manager.service.impl.PriceChangesetServiceImpl.approve(PriceChangesetServiceImpl.java:185)**
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:299)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:139)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:107)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:161)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
at $Proxy100.approve(Unknown Source)
at com.companyname.apps.manager.webapp.controller.pricechanges.PriceChangeDetailsController.onSubmit(PriceChangeDetailsController.java:115)
谢谢!
答案 0 :(得分:2)
OpenSessionInViewInterceptor
旨在让会话在单个请求期间保持打开状态。它不是为了在多个请求中保持会话打开而设计的。实际上,强烈劝阻做这样的事情。一旦请求完成,就应该发布会话。
如果您尝试将Hibernate对象重新附加到新会话,作为新请求的一部分,那么您需要使用reattach()
,merge()
等内容。休眠Session
或EntitymManager
。 OpenSessionInViewInterceptor
不会帮助你。