如何与OpenSessionInViewInterceptor一起重新打开Spring会话

时间:2010-10-11 16:46:20

标签: java hibernate spring

我正在使用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)

谢谢!

1 个答案:

答案 0 :(得分:2)

OpenSessionInViewInterceptor旨在让会话在单个请求期间保持打开状态。它不是为了在多个请求中保持会话打开而设计的。实际上,强烈劝阻做这样的事情。一旦请求完成,就应该发布会话。

如果您尝试将Hibernate对象重新附加到新会话,作为新请求的一部分,那么您需要使用reattach()merge()等内容。休眠SessionEntitymManagerOpenSessionInViewInterceptor不会帮助你。