一千萬個為什麽

搜索

在線程中重用Hibernate會話

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

謝謝

最佳答案

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

flush 關閉會話。但是,從Hibernate 3.1開始,如果將 current_session_context_class 配置為“ thread ”或“”, commit 將關閉會話 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

See this thread and the section 2.5. Contextual sessions in the documentation for background on this.

那麽,我如何在之前關閉的同一個線程中重用Hibernate Session?

使用內置的“托管”策略(將 current_session_context_class 屬性設置為托管)或使用自定義 CurrentSessionContext 派生自 ThreadLocalSessionContext 並覆蓋 ThreadLocalSessionContet.isAutoCloseEnabled()

Again, see the above links and also What about the extended Session pattern for long Conversations?

轉載註明原文: 在線程中重用Hibernate會話