Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring JpaRepostory删除vs deleteInBatch_Java_Spring_Spring Data - Fatal编程技术网

Java Spring JpaRepostory删除vs deleteInBatch

Java Spring JpaRepostory删除vs deleteInBatch,java,spring,spring-data,Java,Spring,Spring Data,春季JpaRepostory中的delete(…)和deleteInBatch(…)方法有什么区别?第二个“删除一条SQL语句中的项”,但从应用程序/数据库的角度来看,这意味着什么?为什么存在两种结果相似的不同方法,何时使用一种或另一种更好 编辑: 这同样适用于deleteAll()和deleteAllInBatch() 删除方法将在一次操作中删除您的实体。deleteInBatch将批处理多个delete语句,并将它们作为一个操作删除 如果需要大量的删除操作,则批删除可能会更快。deleteI

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

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

删除方法将在一次操作中删除您的实体。
deleteInBatch
将批处理多个delete语句,并将它们作为一个操作删除

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

deleteInBatch(…)
日志中的显示如下:
DELETE FROM table_name,其中((((((?=id)或(?=id))或(?=id))或(?=id))或(?=id))或(?=id))

如果要删除的数据量很大,达到SQL server查询的最大大小,则可能会导致问题:
这里的答案不完整

首先,让我们检查一下

void deleteInBatch(可编辑实体)
删除批处理中的给定实体,这意味着它将创建单个查询。
因此,“delete[All]InBatch”方法将使用JPA批删除,如“delete FROM table[WHERE…]”。这可能更有效,但也有一些警告:

  • 这将不会调用您可能拥有的任何JPA/Hibernate生命周期挂钩(@PreDelete)
  • 它不会级联到其他实体
  • 您必须清除持久性上下文,或者假设它无效
这是因为JPA将向数据库发出批量删除语句,绕过缓存等,因此无法知道哪些实体受到影响

虽然我在这里找不到一篇具体的文章,但我还是推荐所有已经写好的文章,以便更深入地理解JPA


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

好的,我理解这一点。但它仍然不能回答为什么存在两种方法?如今,每个人都希望执行每件事情的速度越来越快,所以为什么不使用例如deleteAllInBatch实现作为deleteAll的默认实现,并亲吻整个JPARepository API。因为批处理会影响性能。它只比特定数量操作中的单个查询快。delete删除一项,deleteAll逐个删除所有项(它调用“delete from where id=?”N次),deleteInBatch通过单个sql删除操作删除所有项:“delete from”。我认为deleteInBatch对性能没有影响,如果我们将其与delete()或deleteAll()进行比较,如果您的实体包含@ElementCollection,您应该使用deleteAll()而不是deleteAllInBatch(),这不是一个完整的答案。它非常简单,甚至不提供文档。我还没有对此进行研究,但我敢打赌,使用批处理方法会跳过很多内容,例如应用程序提供的实体侦听器和持久性提供程序的验证逻辑。已确认,大型deleteInBatch调用会导致StackOverflower错误。为了避免这种情况,应该编写一个自定义查询来使用IN语句,或者将批处理分解成更小的块。
void deleteInBatch(Iterable<T> entities)
Deletes the given entities in a batch which means it will create a single Query.