2012-04-28 53 views
2

我在我的項目中使用了Spring + JPA + Hibernate。 該項目結構如下: - DAO層 - 負責獲取數據。 DAO以Model對象的形式返回數據。 - 服務層 - 調用DAO並以UI所需的形式處理/轉換(模型)數據。獲取「會話關閉」異常有時

我正在使用@Transactional來處理服務層上的方法。

我面臨的問題,有時我從Lazily加載的集合中讀取數據時出現「Session is closed」錯誤。 另外,我並不是始終如一地面對這個問題。 從TestNG測試運行時,以及當應用程序部署爲WAR時,有時會出現此錯誤。

我粘貼例外,我得到在運行TestNG進行:

org.hibernate.SessionException:會話被關閉! at org.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:72) at org.hibernate.impl.SessionImpl.getBatcher(SessionImpl.java:305) at org.hibernate.loader.Loader.doQuery(Loader。 java:854) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274) at org.hibernate.loader.Loader.loadEntity(Loader.java:2037) at 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) at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(Defau ltLoadEventListener.java:496) 在org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:477) 在org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:227) 在有機hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:147) at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:1090) at 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.jav a:190) at com.applications.qi.etplugin.et.model.impl.ETTestCasePackage _ $$ _ javassist_21.getVertical(ETTestCasePackage _ $$ _ javassist_21.java) at 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) at java.lang.reflect.Method.invoke(Method.java:597) at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:197) at com.applications .qi.etplugin.et.model.impl.ETTestCasePackage _ $$ _ javassist_21.getVertical(ETTestCasePa ckage _ $$ _ javassist_21.java) at com.applications.qi.etplugin.et.dao.impl.TestCaseDAOTest.Test2(TestCaseDAOTest.java:62) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun。 reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at 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.in vokeHookable(MethodInvocationHelper.java:194) at org.testng.internal.Invoker.invokeMethod(Invoker.java:695) at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:894) at 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) at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread。 Java的:662)

這是我第一個使用Spring/JPA/Hibernate的項目。 我無法找出可能導致此問題的原因? 也可以做些什麼來解決這個問題?

請讓我,如果需要一些更多的信息。 任何幫助/指針高度讚賞:)

回答

1

當你取懶對象接受你,而不是真正的代理對象。

這可能是因爲你想在您的交易完成,會議結束訪問沒有啓動代理對象。

我相信你需要考慮的兩個選項:

  1. 認真檢討你的事務邊界,並確保您的所有對象操作的事務邊界內發生。它會像「視圖中打開會話」設計模式。

  2. 讓所有的收藏EAGER。在這種情況下,您將收到大量不必要的數據庫查詢。

希望它有幫助。

+0

丹尼您好,感謝您的回答。我做了一些關於「在視圖中打開會話」的搜索,它幫助我理解控制事務邊界的不同策略。就我而言,我覺得,我正在閱讀事務邊界中的懶惰對象,但仍然有時會得到「Session is closed」的執行。很明顯,我在理解OR方面存在一些缺陷,這與我在Spring上下文文件中設置事務管理器的方式有關。 – sak 2012-04-29 06:41:41

+0

將繼續閱讀更多文章,以找出問題所在。 謝謝丹尼。 – sak 2012-04-29 06:47:55

相關問題