Hibernate Session 保存操作是否与底层数据库事务同步?

Does the Hibernate Session save operation synchronize with the underlying DB transaction?

HIbernate commit() and flush()

看到了这个例子
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();


for ( int i=0; i<100000; i++ ) {
    Customer customer = new Customer(.....);
    session.save(customer);
    if ( i % 20 == 0 ) { //20, same as the JDBC batch size
        //flush a batch of inserts and release memory:
        session.flush();
        session.clear();
    }
}

tx.commit();
session.close();

我的理解是当我们执行 session.save(customer)session.update(....) 时,hibernate 将数据库会话与 hibernate 同步? 它是否只在 commit/flush/refresh 时而不是在 update/save 时变色?

Hibernate Session 的生命周期受限于逻辑事务的开始和结束。会话为映射实体 类 的实例提供创建、读取和删除操作。 Save/update/delete 是事务性的 operations.So 来执行这些操作,需要从

开始事务
session.beginTransaction();

然后只有我们可以执行save/update/delete。 Hibernate 提供了良好的事务回滚机制。只有通过

提交事务时,Hibernate 才会更改数据库
session.getTransaction().commit();

直到执行提交 save/update/delete 将与事务实例一起使用,一旦调用提交方法,hibernate 就会与数据库交互以应用更改。

如果save/update/delete失败,将执行回滚过程,保持数据库不变。

关于休眠事务研究的更多信息https://www.javatpoint.com/hibernate-transaction-management-example

因此hibernate通过commit/flush/refresh

将DB会话与hibernate会话同步

Hibernate Session 和 JPA EntityManager(a.k.a 持久性上下文)充当 write-behind cache so entity state transitions 在刷新期间暂存并传播到 DB。

默认情况下,commit 调用会触发 flush,即执行 INSERT、UPDATE 和 DELETE 语句时。

后写缓存的好处如下:

  • 应用自动更容易JDBC batch updates
  • 如果没有事先SELECT声明,连接获取可以延迟到刷新,因此减少数据库连接租用时间。

有关 Hibernate 工作原理的更多详细信息,请查看 this tutorial which features over 100 articles 关于 JPA、Hibernate 和最常见的 RDBMS。