@gsaw

[spring jpa repository] как правильно deleteInBatch?

Привет,

надо из таблицы удалить записиси и создать новые, новые могут иметь теже первичные ключи, что и удаляемые. Удаляются по foreign key.

Если делать так, то JPA/hibernet сначала делает запрос к базе данных, потом удаляет записи и для каждой выполняет DELETE FROM. Что не очень оптимально, так как записей может быть много.

rep.deleteAllByForeignKey(forejgnKey);
inputList.forEach(newrec -> repo.save(newrec));


Если же делаю так, то JPA делает сначала запрос к базе данных, потом одним DELETE FROM удаляет все записи, но потом спотыкается на добавлении новых записей

repo.deleteInBatch(repo.findAllByForeignKey(foreignKey));
inputList.forEach(newrec -> repo.save(newrec));


Ошибка выходит типа такой

org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)


Все в одной транзакции делается, может надо как то сказать hibernate, что "данные удалены, забудь про них?"
  • Вопрос задан
  • 27 просмотров
Решения вопроса 1
@gsaw Автор вопроса
Как только отправил вопрос, на ум пришло посмотреть документацию по deleteInBatch и там черным по белому написанно.

Assume that we will clear the EntityManager after the call.


Вообщем em.clear() между deleteInBatch и save помогло.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Rubbles (SBDA Group) Москва
от 180 000 до 240 000 ₽
Nedra Санкт-Петербург
от 250 000 ₽
08 мар. 2021, в 13:49
2000 руб./в час
08 мар. 2021, в 13:46
800 руб./в час
08 мар. 2021, в 13:42
1000 руб./в час