Hibernate的Session.close()是否会自动回滚未提交的事务?

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连接,那么实际的事务处理可能完全超出了您的应用程序的范围.