我想执行批量更新。我使用JPA和Hibernate 5作为JPA提供程序,并具有以下代码:
for (int i = 0; i < entities.size(); i++) {
if (i > 0 && i % JpaSettings.BATCH_SIZE == 0) {
entityManager.flush();
entityManager.clear();
}
....
count = count + entityManager.createQuery(criteria).executeUpdate();
}
entityManager.flush();
entityManager.clear();
但是,此代码似乎不会执行批处理更新。因为,例如,当我插入时,我在log中看到类似这样的内容:
DEBUG org.hibernate.engine.jdbc.batch.internal.BatchingBatch - Executing batch size: 2
但是在我的更新操作之后,我没有看到这条消息。有人能告诉我如何使用executeUpdate进行批量更新吗?
发布于 2021-06-28 17:24:59
如果您没有启用自动提交,那么您可能只会看到该会话中的数据。
entityManager.flush()
将数据发送到DB,并为您的会话保留数据,但在事务上下文中。因此,如果事务没有被提交或回滚,或者客户端被终止,那么事务的数据将不会以事务的方式持久化到表中,因此您将无法访问它。
所以试着打电话给
entityManager.getTransaction().commit()
看看这是否会改变行为。注意,事务不能再回滚,但这一点应该是显而易见的。
发布于 2021-06-28 21:39:00
使用.executeUpdate()
是不可能做到这一点的,因为当您调用此方法时,hibernate将执行此SQL语句来获取修改后的行数。因此,无法使用.executeUpdate()
进行批量更新。
发布于 2021-06-27 02:02:30
这可以通过EniityManager - persistent使用会话操作或为实体类的持久化实例设置更新值来实现。
for (int i = 0; i < entities.size(); i++) {
if (i > 0 && i % JpaSettings.BATCH_SIZE == 0) {
entityManager.flush();
entityManager.clear();
}
....
entityManager.persist(obj);
}
entityManager.flush();
entityManager.clear();
至于更新的记录数,您可以查看DB日志中执行的查询。
执行批量更新时需要注意的一件事是属性- hibernate.order_updates和hibernate.batch_versioned_data需要设置为true。下面的博客展示了这一点。
博客:https://www.baeldung.com/jpa-hibernate-batch-insert-update
https://stackoverflow.com/questions/68045361
复制相似问题