@Modifying и загруженные сущности
Вопрос
В транзакции загрузили Order (status = NEW), затем выполнили @Modifying @Query("update Order o set o.status = :s where o.id = :id") со значением PAID, затем прочитали order.getStatus() у загруженного объекта. Что вернётся?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
PAID: Hibernate синхронизирует объект- Исключение: загруженную сущность так не обновить
NEW: bulk-update идёт мимо контекстаправильный ответnull: объект сбрасывается после update
Разбор
JPQL UPDATE выполняется прямо в базе и не трогает объекты в контексте персистентности, поэтому загруженный Order хранит старое значение. Хуже того, при flush старое значение может перезаписать новое, если сущность была изменена. Решение: @Modifying(clearAutomatically = true, flushAutomatically = true) или менять сущность через объект.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.