f1d*_*ave 13 java session hibernate transactions
我正在阅读目前的Hibernate文档,我看到了以下引用:
如果Session抛出异常(包括任何SQLException),则立即回滚数据库事务,调用Session.close()并丢弃Session实例.Session的某些方法不会使会话保持一致状态.Hibernate抛出的异常都不能被视为可恢复的.确保通过在finally块中调用close()来关闭Session.
就我而言,这一切都是有道理的,但它确实让我想知道关闭会话的效果是什么,交易既不提交也不回滚?
例如,考虑以下事项:
session = getSessionFactory().openSession();
session.beginTransaction();
session.save(carObject);
//session.getTransaction().commit();
session.close();
Run Code Online (Sandbox Code Playgroud)
如果提交已注释掉,并且此处没有调用回滚,session.close()的预期行为是什么?它是否只是自动回滚该提交,是否会留下"挂起"事务?等等
(我明白这显然不是一个好习惯 - 我只是试图更深入地了解基础概念.)
Pav*_*ral 10
我已经对Hibernate进行了一些挖掘:
持久性会话使其生命周期与JDBC连接有些独立.当您关闭Hibernate时Session,连接被释放."释放连接"的确切含义取决于首先获得连接的方式:
sessionFactory.openStatelessSession(connection)),您将在调用时获得与可能未完成的事务的连接session.close()session.close()最终会通话connection.close()Hibernate没有自动会话刷新或事务提交/回滚.JPA的状态相同EntityManager.
那么到底发生了什么取决于你的连接提供者/数据源.使用C3PO时,任何未完成的事务将在连接返回池时回滚.另一方面,如果您已经管理了JTA连接,那么实际的事务处理可能完全超出了您的应用程序的范围.