1

在HIbernate commit() 和 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(....)?它是否仅在提交/刷新/刷新时而不是在更新/保存时进行晒黑?

4

2 回答 2

1

HibernateSession和 JPA EntityManager(又名 Persistence Context)充当后写缓存,因此实​​体状态转换在刷新期间被分阶段并传播到 DB。

默认情况下,commit调用触发 aflush并且在执行 INSERT、UPDATE 和 DELETE 语句时。

后写缓存的好处如下:

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

有关 Hibernate 工作原理的更多详细信息,请查看本教程,其中包含 100 多篇关于 JPA、Hibernate 和最常见的 RDBMS 的文章。

于 2017-04-19T07:35:09.107 回答
0

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

session.beginTransaction();

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

session.getTransaction().commit();

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

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

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

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

于 2017-04-19T04:10:53.480 回答