Выбор ответа Junior Hibernate: N+1, lazy, кеш спрашивают часто обновлено
LazyInitializationException
Вопрос
Когда возникает LazyInitializationException?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: При обращении к ленивой связи после закрытия контекста. Ленивая связь это прокси, который при первом обращении делает запрос через свой контекст персистентности.
Варианты ответа
- Когда в таблице нет записи с запрошенным id
- Когда связь сущности помечена как EAGER, а данных слишком много
- При обращении к ленивой связи после закрытия контекстаправильный ответ
- При двух параллельных транзакциях над одной сущностью
Разбор
Ленивая связь это прокси, который при первом обращении делает запрос через свой контекст персистентности. Если транзакция закончилась и контекст закрыт (а OSIV выключен), загрузить нечем, и Hibernate бросает исключение. Правильное лечение: загрузить нужное внутри транзакции через join fetch, EntityGraph или DTO. Отсутствие записи даёт EntityNotFoundException или пустой Optional.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.