Выбор ответа Middle Spring Data JPA обновлено

@Modifying и загруженные сущности

Вопрос

В транзакции загрузили Order (status = NEW), затем выполнили @Modifying @Query("update Order o set o.status = :s where o.id = :id") со значением PAID, затем прочитали order.getStatus() у загруженного объекта. Что вернётся?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: NEW: bulk-update идёт мимо контекста. JPQL UPDATE выполняется прямо в базе и не трогает объекты в контексте персистентности, поэтому загруженный Order хранит старое значение.

Варианты ответа

  1. PAID: Hibernate синхронизирует объект
  2. Исключение: загруженную сущность так не обновить
  3. NEW: bulk-update идёт мимо контекстаправильный ответ
  4. null: объект сбрасывается после update

Разбор

JPQL UPDATE выполняется прямо в базе и не трогает объекты в контексте персистентности, поэтому загруженный Order хранит старое значение. Хуже того, при flush старое значение может перезаписать новое, если сущность была изменена. Решение: @Modifying(clearAutomatically = true, flushAutomatically = true) или менять сущность через объект.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.