首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用executeUpdate()进行批量更新

使用executeUpdate()进行批量更新
EN

Stack Overflow用户
提问于 2021-06-19 17:21:27
回答 3查看 369关注 0票数 0

我想执行批量更新。我使用JPA和Hibernate 5作为JPA提供程序,并具有以下代码:

代码语言:javascript
运行
复制
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中看到类似这样的内容:

代码语言:javascript
运行
复制
DEBUG org.hibernate.engine.jdbc.batch.internal.BatchingBatch - Executing batch size: 2

但是在我的更新操作之后,我没有看到这条消息。有人能告诉我如何使用executeUpdate进行批量更新吗?

EN

回答 3

Stack Overflow用户

发布于 2021-06-28 17:24:59

如果您没有启用自动提交,那么您可能只会看到该会话中的数据。

代码语言:javascript
运行
复制
entityManager.flush()

将数据发送到DB,并为您的会话保留数据,但在事务上下文中。因此,如果事务没有被提交或回滚,或者客户端被终止,那么事务的数据将不会以事务的方式持久化到表中,因此您将无法访问它。

所以试着打电话给

代码语言:javascript
运行
复制
entityManager.getTransaction().commit()

看看这是否会改变行为。注意,事务不能再回滚,但这一点应该是显而易见的。

票数 0
EN

Stack Overflow用户

发布于 2021-06-28 21:39:00

使用.executeUpdate()是不可能做到这一点的,因为当您调用此方法时,hibernate将执行此SQL语句来获取修改后的行数。因此,无法使用.executeUpdate()进行批量更新。

票数 0
EN

Stack Overflow用户

发布于 2021-06-27 02:02:30

这可以通过EniityManager - persistent使用会话操作或为实体类的持久化实例设置更新值来实现。

代码语言:javascript
运行
复制
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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68045361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档