【发布时间】:2010-05-08 11:28:22
【问题描述】:
我在某处读到,当刷新会话或提交事务时,会话本身会被 Hibernate 关闭。那么,我如何在同一个线程中重用之前关闭的 Hibernate Session?
谢谢
【问题讨论】:
标签: java hibernate transactions
我在某处读到,当刷新会话或提交事务时,会话本身会被 Hibernate 关闭。那么,我如何在同一个线程中重用之前关闭的 Hibernate Session?
谢谢
【问题讨论】:
标签: java hibernate transactions
我在某处读到,当刷新会话或提交事务时,会话本身会被 Hibernate 关闭。
flush 确实不关闭会话。但是,从 Hibernate 3.1 开始,如果您将 current_session_context_class 配置为“thread”或“jta”,或者如果您使用的是 TransactionManagerLookup(强制性 JTA),commit 将关闭会话和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 thread 和2.5. Contextual sessions 部分了解相关背景信息。
那么,我怎样才能在同一个线程中重用之前关闭的 Hibernate Session?
使用内置的“managed”策略(将current_session_context_class 属性设置为managed)或使用自定义CurrentSessionContext 从ThreadLocalSessionContext 派生并覆盖ThreadLocalSessionContet.isAutoCloseEnabled().
再次,请参阅上面的链接以及What about the extended Session pattern for long Conversations?
【讨论】:
错了。会话保持打开状态,只是一个新事务开始。主要的是当前附加到会话的所有对象都保持附加,因此如果您不清除会话,则此处存在内存泄漏。
【讨论】: