Spring Удаление JpaRepostory vs deleteInBatch

В чем разница между методами delete(...) и deleteInBatch(...) в JpaRepostory в Spring? Второй "удаляет элементы в одном операторе SQL", но что это значит с точки зрения приложения/базы данных? Почему существуют два разных метода с одинаковыми результатами и когда лучше использовать один или другой?

РЕДАКТИРОВАТЬ: То же самое относится и к deleteAll() и deleteAllInBatch()...

Ответ 1

Метод delete собирается удалить вашу сущность за одну операцию. deleteInBatch собирается выполнить несколько операций удаления и удалить их как 1 операцию.

Если вам нужно много операций удаления, пакетное удаление может быть быстрее.

Ответ 2

deleteInBatch(...) в журнале будет выглядеть следующим образом: DELETE FROM table_name WHERE (((((((? = id) OR (? = id)) OR (? = id)) OR (? = id)) OR (? = id)) OR (? = id)) OR (? = id))

Это может привести к проблеме, если удаляется большой объем данных, который достигает максимального размера запроса SQL-сервера: максимальный размер для запроса SQL Server? В пункте? Есть ли лучший подход

Ответ 3

Ответы здесь не полны!

Прежде всего, давайте проверим документацию!

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

Таким образом, методы "delete [All] InBatch" будут использовать пакетное удаление JPA, например "DELETE FROM table [WHERE...]". Это может быть ПУТИ более эффективным, но у него есть некоторые оговорки:

  • Это не будет вызывать какие-либо хуки жизненного цикла JPA/Hibernate, которые у вас могут быть (@PreDelete)
  • Это не будет каскадно другим лицам
  • Вы должны очистить свой постоянный контекст или просто предположить, что он недействителен.

Это потому, что JPA будет выдавать массовый оператор DELETE в базу данных, обходя кэш и т.д. И, следовательно, не может знать, какие объекты были затронуты.

См. документы Hibernate

Фактический код гдев Spring Data JPA

И хотя я не могу найти здесь конкретную статью, я бы порекомендовал все, что написал Влад Михалча, чтобы глубже понять JPA.

TLDR: методы "inBatch" используют массовые операторы DELETE, которые могут быть значительно быстрее, но с некоторыми оговорками bc. они обходят кеш JPA. Вы должны действительно знать, как они работают и когда использовать их для выгоды.