gpt4 book ai didi

java - JPA - 批量/批量更新 - 更好的方法是什么?

转载 作者:搜寻专家 更新时间:2023-10-31 19:56:02 27 4
gpt4 key购买 nike

我发现 JPA 不支持以下更新:

Update Person p set p.name = :name_1 where p.id = :id_1,
p.name = :name_2 where p.id = :id_2,
p.name = :name_3 where p.id = :id_3
....
// It could go on, depending on the size of the input. Could be in 100s

所以我有两个选择:

选项 1:

Query q = em.createQuery("Update Person p set p.name = :name where p.id = :id");

For ( int x=0; PersonsList.length; x++ ) {
// add name and id parameters
em.executeUpdate();
}

问题:

  1. 这就是批量更新所需的全部吗?我还需要补充什么吗?我设置了 hibernate.jdbc.batch_size", "20"
  2. 这里是不是默认开启了乐观锁? (虽然我的实体中没有@Version)
  3. 如果不是@Version,我需要做什么才能强制执行乐观锁定?

选项 2:

使用 Select Case 语法或 Criteria API 构造一个查询

问题:

  1. 这里仍然进行批处理吗? (在单个大查询中)
  2. 就性能而言,这是否比第一种方法更好?
  3. 这两个选项中推荐的方法是什么?还有其他更好的方法吗?

最佳答案

在你的问题标题中,你提到了批量更新和删除,但你这次实际上需要批处理。

Bulk Update and Delete当您想要更新/删除所有匹配可以在 WHERE 子句中表达的相同过滤条件的行时需要。

在这里,您需要 JDBC 批量更新。您需要设置以下配置属性:

<property name="hibernate.jdbc.batch_size" value="50"/>

如果这样做,您可以简单地更新实体,Hibernate 将为您批处理 UPDATE 语句。

选项 1 不是很有用,因为它会生成 N 个无法批处理的 UPDATE 语句。

选项 2 也不是很有用,因为它会生成非常复杂的查询,其执行计划可能比在简单的批处理 UPDATE 语句中执行所有内容更复杂。

所以,这样做:

  1. 使用分页获取实体
  2. 使用 Hibernate 更新它们,让它为您进行批量更新。

如果您有很多这样的实体,请使用 query pagination .

When using bulk updates, Hibernate does not increment the version column used for optimistic locking automatically, as it does for regular entity updates, so you need to increment the version entity attribute explicitly.

关于java - JPA - 批量/批量更新 - 更好的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17600961/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com