gpt4 book ai didi

java - 如何与 OpenSessionInViewInterceptor 结合重新打开 Spring session

转载 作者:行者123 更新时间:2023-12-02 08:28:56 25 4
gpt4 key购买 nike

我正在使用带有 Hibernate 的 Spring MVC 框架。我的所有 Controller 都使用 OpenSessionInViewInterceptor。

我在 Controller 的 onSubmit() 方法中收到“无法初始化代理 - 拥有的 session 已关闭”错误。我相信这是因为 Hibernate 需要返回数据库来获取作为代理检索的某些对象,并且 OpenSessionInViewInterceptor 已经关闭了 session 。

我一直在通过在对象上使用 HibernateTemplate().reattach() 来解决这些问题。

我的问题是:

a) 我的诊断正确吗?b) 有没有更好的方法来重新打开 Hibernate session ?有没有一种方法可以在 Hibernate 中以编程方式重新打开 session 而无需 reattach()?

编辑:堆栈跟踪如下:当我在提交方法中迭代 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)

谢谢!

最佳答案

OpenSessionInViewInterceptor 旨在在单个请求期间保持 session 打开。它并不是为了在多个请求之间保持 session 打开而设计的。事实上,强烈建议不要这样做。请求完成后应释放 session 。

如果您尝试将 Hibernate 对象重新附加到新 session (作为新请求的一部分),那么您需要使用诸如 reattach()merge( ) 等,在 Hibernate SessionEntitymManager 上。 OpenSessionInViewInterceptor 不会在这里帮助您。

关于java - 如何与 OpenSessionInViewInterceptor 结合重新打开 Spring session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3908218/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com