我已经读过某个地方,当刷新会话或提交事务时,会话本身由Hibernate关闭。那么,我如何在之前关闭的同一个线程中重用Hibernate Session?
由于
答案 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的所有对象都附加了,所以如果你没有清除会话,你就会在这里发生内存泄漏。