在线程中重用Hibernate会话

时间:2010-05-08 11:28:23

标签: java hibernate transactions

我已经读过某个地方,当刷新会话或提交事务时,会话本身由Hibernate关闭。那么,我如何在之前关闭的同一个线程中重用Hibernate Session?

由于

2 个答案:

答案 0 :(得分:11)

  

我已经读过某个地方,当刷新会话或提交事务时,会话本身由Hibernate关闭。

flush 关闭会话。但是,从Hibernate 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 Session?

使用内置的“managed”策略(将current_session_context_class属性设置为managed)或使用从{{1}派生的自定义CurrentSessionContext 并覆盖ThreadLocalSessionContext

再次,请参阅上述链接以及What about the extended Session pattern for long Conversations?

答案 1 :(得分:2)

错误。会话保持打开状态,只是新事务开始。最主要的是当前附加到会话STAY的所有对象都附加了,所以如果你没有清除会话,你就会在这里发生内存泄漏。