Spring 获得;“会议结束”;有时例外

Spring 获得;“会议结束”;有时例外,spring,hibernate,jpa,Spring,Hibernate,Jpa,我在我的项目中使用Spring+JPA+Hibernate。 本项目结构如下: -DAO层-负责获取数据。DAO以模型对象的形式返回数据。 -服务层-调用DAO并以UI所需的形式处理/转换(模型)数据 我将@Transactional用于服务层上的方法 我面临的问题是,有时在从延迟加载的集合中读取数据时出现“会话已关闭”错误。 我也没有一直面对这个问题。 我有时在从TestNG测试运行时,以及当应用程序部署为WAR时,会出现此错误 我正在粘贴运行TestNG测试时得到的异常: org.hiber

我在我的项目中使用Spring+JPA+Hibernate。 本项目结构如下: -DAO层-负责获取数据。DAO以模型对象的形式返回数据。 -服务层-调用DAO并以UI所需的形式处理/转换(模型)数据

我将@Transactional用于服务层上的方法

我面临的问题是,有时在从延迟加载的集合中读取数据时出现“会话已关闭”错误。 我也没有一直面对这个问题。 我有时在从TestNG测试运行时,以及当应用程序部署为WAR时,会出现此错误

我正在粘贴运行TestNG测试时得到的异常:

org.hibernate.SessionException:会话已关闭! 位于org.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:72) 位于org.hibernate.impl.SessionImpl.getBatcher(SessionImpl.java:305) 位于org.hibernate.loader.loader.doQuery(loader.java:854) 在org.hibernate.loader.loader.doQueryAndInitializeNonLazyCollections(loader.java:274)上 位于org.hibernate.loader.loader.loadEntity(loader.java:2037) 位于org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:86) 位于org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:76) 位于org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3268) 位于org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:496) 位于org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:477) 位于org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:227) 位于org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:147) 位于org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:1090) 在org.hibernate.impl.SessionImpl.immediateLoad上(SessionImpl.java:1026) 位于org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:176) 位于org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:215) 位于org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190) 在com.applications.qi.etplugin.et.model.impl.ETTestCasePackage\u$$\ ujavassist\u21.getVertical(ETTestCasePackage\u$$\ ujavassist\u21.java) 位于com.applications.qi.etplugin.et.model.impl.ETTestCasePackage.getVertical(ETTestCasePackage.java:78) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)中 位于java.lang.reflect.Method.invoke(Method.java:597) 位于org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:197) 在com.applications.qi.etplugin.et.model.impl.ETTestCasePackage\u$$\ ujavassist\u21.getVertical(ETTestCasePackage\u$$\ ujavassist\u21.java) 位于com.applications.qi.etplugin.et.dao.impl.TestCaseDAOTest.Test2(TestCaseDAOTest.java:62) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)中 位于java.lang.reflect.Method.invoke(Method.java:597) 位于org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:80) 位于org.testng.internal.MethodInvocationHelper$1.runTestMethod(MethodInvocationHelper.java:182) 位于org.springframework.test.context.testng.AbstractTestNGSpringContextTests.run(AbstractTestNGSpringContextTests.java:158) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)中 位于java.lang.reflect.Method.invoke(Method.java:597) 位于org.testng.internal.MethodInvocationHelper.invokeHookable(MethodInvocationHelper.java:194) 位于org.testng.internal.Invoker.invokeMethod(Invoker.java:695) 位于org.testng.internal.Invoker.invokeTestMethod(Invoker.java:894) 位于org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1219) 位于org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127) 位于org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111) 位于java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 运行(Thread.java:662)

这是我第一个使用Spring/JPA/Hibernate的项目。 我无法找出导致此问题的原因? 还有,可以做些什么来解决这个问题

如果需要更多信息,请告诉我。
非常感谢任何帮助/指针:)

当您获取惰性对象时,您将接收代理对象而不是真实对象

这可能是因为您在事务完成和会话关闭后试图访问未启动的代理对象

我相信你需要考虑两个选项:

  • 认真检查事务边界,并确保所有对象操作都发生在这些事务边界内。它将类似于“视图中的开放会话”设计模式

  • 让你所有的收藏都变得急切。在这种情况下,您将收到许多不必要的数据库查询


  • 希望有帮助。

    嗨,丹尼,谢谢你的回答。我搜索了“视图中的开放会话”,它帮助我理解控制事务边界的不同策略。在我的例子中,我感觉,我正在阅读t中的惰性对象