春季 JpaRepostory delete vs deleteInBatch

2022-09-01 06:50:31

和 方法在 JpaRepostory in Spring 有什么区别?第二个“删除一个SQL语句中的项目”,但是从应用程序/数据库的角度来看,这意味着什么?为什么存在两种不同的方法,结果相似,什么时候最好使用一种或另一种?delete(...)deleteInBatch(...)

编辑:这同样适用于 和 ...deleteAll()deleteAllInBatch()


答案 1

这里的答案并不完整!

首先,让我们检查文档

void deleteInBatch(Iterable<T> entities)
Deletes the given entities in a batch which means it will create a single Query.

因此,“delete[All]InBatch”方法将使用JPA批量删除,例如“从表中删除[WHERE ...]”。这可能更有效率,但它有一些警告:

  • 这不会调用您可能拥有的任何 JPA/休眠生命周期挂钩(@PreDelete)
  • 它不会级联到其他实体
  • 您必须清除持久性上下文,或者只是假设它已失效。

这是因为 JPA 会向数据库发出批量 DELETE 语句,绕过缓存等,因此无法知道哪些实体受到影响。

请参阅休眠文档

Spring Data JPA 中的实际代码

虽然我在这里找不到具体的文章,但我会推荐Vlad Mihalcea写的所有内容,以便更深入地了解JPA。

TLDR:“inBatch”方法使用批量 DELETE 语句,这可以大大加快速度,但有一些警告 bc。它们绕过 JPA 缓存。您应该真正了解它们的工作原理以及何时使用它们来受益。


答案 2

该方法将在一次操作中删除实体。将批处理多个删除语句,并将它们作为 1 个操作删除。deletedeleteInBatch

如果您需要大量删除操作,则批量删除可能会更快。


推荐