Java 在线程中重用Hibernate会话
我在某个地方读到过,当刷新会话或提交事务时,会话本身被Hibernate关闭。那么,如何在同一线程中重用先前关闭的Hibernate会话呢Java 在线程中重用Hibernate会话,java,hibernate,transactions,Java,Hibernate,Transactions,我在某个地方读到过,当刷新会话或提交事务时,会话本身被Hibernate关闭。那么,如何在同一线程中重用先前关闭的Hibernate会话呢 谢谢你错了。会话保持打开状态,只有一个新事务开始。最重要的是,当前连接到会话的所有对象都保持连接状态,因此,如果不清除会话,则此处存在内存泄漏 我在某个地方读到过,当刷新会话或提交事务时,会话本身被Hibernate关闭 flush不会关闭会话。但是,从Hibernate 3.1开始,如果将当前会话上下文类配置为“线程”或“jta”,或者使用事务管理器loo
谢谢你错了。会话保持打开状态,只有一个新事务开始。最重要的是,当前连接到会话的所有对象都保持连接状态,因此,如果不清除会话,则此处存在内存泄漏 我在某个地方读到过,当刷新会话或提交事务时,会话本身被Hibernate关闭
flush
不会关闭会话。但是,从Hibernate 3.1开始,如果将当前会话上下文类配置为“线程”或“jta
”,或者使用事务管理器lookup
(强制jta)和getCurrentSession()
,则提交将关闭会话
下面的代码对此进行了说明(此处当前会话\u上下文\u类
设置为thead
):
有关这方面的背景信息,请参见d和文档中的部分
那么,如何在同一线程中重用先前关闭的Hibernate会话呢
使用内置的“managed
”策略(将current\u session\u context\u class
属性设置为managed
),或者使用从ThreadLocalSessionContext
派生的自定义CurrentSessionContext
并覆盖threadlocalsessioncontent.isAutoCloseEnabled()
同样,请参见上述链接,如果当前会话上下文类设置为“线程”或“jta”,则也将回滚并关闭会话?
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