Вопрос проверяет понимание жизненного цикла Hibernate-сессии и механизма ленивой загрузки сущностей.
При обращении к lazy-сущности вне активной сессии будет выброшено исключение LazyInitializationException. Это происходит потому, что Hibernate не может загрузить данные без открытой сессии. Прокси-объект существует, но он не знает, откуда получить данные. Такая ситуация часто возникает при неправильной работе с транзакциями. Решается корректным управлением сессией или явной загрузкой данных.
Lazy loading предполагает, что связанные данные загружаются только при первом обращении, а не сразу при загрузке основной сущности.
Hibernate:
возвращает proxy-объект
откладывает SQL-запрос
выполняет его при обращении к данным
Order order = orderRepository.findById(id);
order.getItems(); // здесь может быть ошибка
Если в этот момент:
сессия закрыта
транзакция завершена
Hibernate не может выполнить SQL.
Возникает:
LazyInitializationException
Причина:
отсутствует связь с persistence context
На практике используют:
корректные транзакционные границы (@Transactional)
fetch join в запросах
DTO-проекции
явную инициализацию до закрытия сессии
LazyInitializationException — это не баг, а сигнал о неправильном управлении сессией. Решение — загружать данные тогда, когда сессия ещё активна.