@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, что "данные удалены, забудь про них?"
  • Вопрос задан
  • 157 просмотров
Решения вопроса 1
@gsaw Автор вопроса
Как только отправил вопрос, на ум пришло посмотреть документацию по deleteInBatch и там черным по белому написанно.

Assume that we will clear the EntityManager after the call.


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

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

Войти через центр авторизации
Похожие вопросы