У моего объекта есть как открытый ключ (id), так и бизнес-ключ (пространство имен). Мне нужно обновить запись, заменив старый. Итак, я ищу его с помощью бизнес-ключа, удаляю его и сохраняю новый объект. Это работает, если каждая операция выполняется в собственной транзакции. Но как только я поместил все их в одну транзакцию, к моменту выполнения save() функция delete() еще не была выполнена, поэтому я получаю нарушение ограничения.Spring JpaRepository: delete() с последующим сохранением() в той же транзакции
transactionTemplate.execute(status -> {
MyEntity oldEntity = repository.findByNamespace(namespace);
if (oldEntity != null) {
repository.delete(oldEntity);
}
repository.save(newEntity);
return null;
});
Я на самом деле удалось обойти его, добавив
repository.flush();
Но я действительно не понимаю, почему мне нужен этот флеш().
Я думаю, это потому, что провайдер JPA чувствует себя свободно, чтобы реорганизовать и/или оптимизировать запись базы данных ожидающих изменений из постоянного контекста, в частности, поставщик JPA не чувствует себя обязанным выполнять запись в базе данных в порядке и форме связанных с индивидуальными изменениями постоянного контекста. Во всяком случае, описанная ситуация известна как одна, и флеш() известен как обходной путь. – Michal