2010-05-08 71 views
4

我讀過某個地方,當會話刷新或提交事務時,會話本身由Hibernate關閉。那麼,我如何在以前關閉的同一個線程中重用Hibernate Session呢?在線程中重用Hibernate會話

謝謝

回答

11

我讀過某個地方,當會話刷新或提交事務時,會話本身由Hibernate關閉。

一個flush關閉會話。然而,從休眠3.1開始,一個commit會,如果你配置current_session_context_class關閉會話爲「thread」或「jta」,或者,如果您使用的是TransactionManagerLookup(強制JTA)和getCurrentSession()

下面的代碼說明了這一(與current_session_context_class設置爲thead這裏):

Session session = factory.getCurrentSession(); 
Transaction tx = session.beginTransaction(); 

Product p = new Product(); 
session.persist(p); 
session.flush(); 
System.out.println(session.isOpen()); // prints true 

p.setName("foo"); 
session.merge(p); 
tx.commit(); 
System.out.println(session.isOpen()); // prints false 

參見this threa d和用於在此背景下的文檔中的部分2.5. Contextual sessions

那麼,我怎麼能重用一個Hibernate會話,在同一個線程,以前已關閉?

或者使用內置的「managed」戰略(設置current_session_context_class屬性managed)或使用自定義CurrentSessionContext源自ThreadLocalSessionContext,並覆蓋ThreadLocalSessionContet.isAutoCloseEnabled()

再次,看到上面的鏈接,也What about the extended Session pattern for long Conversations?

+0

將回滾也關閉會話如果current_session_context_class到「線程」或「JTA」? – 2017-01-23 16:22:22

2

錯了。會議保持開放,只是一個新的交易開始。最主要的是當前連接到會話STAY的所有對象,因此如果你沒有清除會話,那麼你在這裏有內存泄漏。

+0

並非總是如此 – 2010-05-08 12:27:58

相關問題