Выбор ответа Junior Hibernate: N+1, lazy, кеш спрашивают часто обновлено

LazyInitializationException

Вопрос

Когда возникает LazyInitializationException?

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

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

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

Коротко

Правильный ответ: При обращении к ленивой связи после закрытия контекста. Ленивая связь это прокси, который при первом обращении делает запрос через свой контекст персистентности.

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

  1. Когда в таблице нет записи с запрошенным id
  2. Когда связь сущности помечена как EAGER, а данных слишком много
  3. При обращении к ленивой связи после закрытия контекстаправильный ответ
  4. При двух параллельных транзакциях над одной сущностью

Разбор

Ленивая связь это прокси, который при первом обращении делает запрос через свой контекст персистентности. Если транзакция закончилась и контекст закрыт (а OSIV выключен), загрузить нечем, и Hibernate бросает исключение. Правильное лечение: загрузить нужное внутри транзакции через join fetch, EntityGraph или DTO. Отсутствие записи даёт EntityNotFoundException или пустой Optional.

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

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