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

Posted

技术标签:

【中文标题】Hibernate Session 保存操作是不是与底层数据库事务同步?【英文标题】:Does the Hibernate Session save operation synchronize with the underlying DB transaction?Hibernate Session 保存操作是否与底层数据库事务同步? 【发布时间】:2017-04-19 03:24:10 【问题描述】:

在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 会将 DB 会话与 hibernate 同步? 它是否仅在提交/刷新/刷新时而不是在更新/保存时进行晒黑?

【问题讨论】:

【参考方案1】:

Hibernate Session 和 JPA EntityManager(也称为持久性上下文)充当 write-behind cache,因此 entity state transitions 在刷新期间被暂存并传播到数据库。

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

后写缓存的好处如下:

自动申请JDBC batch updates要容易得多 如果没有之前的 SELECT 语句,连接获取可以延迟到刷新,从而减少数据库连接租用时间。

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

【讨论】:

在我的测试用例中,当我执行session.save(customer) or session.update(....) 时,没有看到任何插入/更新查询被触发。它仅在提交或刷新时发生。所以你的声明and that's when INSERT, UPDATE, and DELETE statements are executed.在这里似乎不正确? 您实际上是在确认我的说法。仔细阅读【参考方案2】:

Hibernate Session 的生命周期受逻辑事务的开始和结束的限制。 Session 为映射实体类的实例提供创建、读取和删除操作。 保存/更新/删除是事务操作。所以要执行这些操作,需要开始事务

session.beginTransaction();

然后只有我们可以执行保存/更新/删除。 Hibernate 提供了高质量的事务回滚机制。 Hibernate 仅在事务通过提交时才对数据库进行更改

session.getTransaction().commit();

直到提交被执行保存/更新/删除将与事务实例,一旦提交方法被调用休眠与数据库交互以应用更改。

如果保存/更新/删除失败,将执行回滚过程,保持数据库不变。

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

所以hibernate通过commit/flush/refresh同步DB session和hibernate session

【讨论】:

以上是关于Hibernate Session 保存操作是不是与底层数据库事务同步?的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate批量操作

Hibernate深入浅出持久层操作——数据保存&批量操作

hibernate

>hibernate-session中的方法

第二节 hibernate session基本方法介绍

hibernate基础的CRUD的操作