Назад к вопросам
Газпромбанк
Middle
62
В каких случаях появляется исключение LazyInitializationException в Hibernate?
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
Исключение LazyInitializationException в Hibernate возникает, когда пытаются получить доступ к лениво загруженному (lazy) связанному объекту вне контекста активной сессии Hibernate. Обычно это происходит, если сессия уже закрыта, а объект, который был загружен с отложенной инициализацией, пытаются инициализировать.
Например, если у вас есть сущность с ленивой связью:
@Entity
class User {
@OneToMany(fetch = FetchType.LAZY)
private Set<Order> orders;
}
И вы загрузили пользователя в одной сессии, а потом пытаетесь получить user.getOrders() уже после закрытия сессии, то получите LazyInitializationException.
Чтобы избежать этого, можно:
- Использовать
fetch = FetchType.EAGER(но это может привести к избыточной загрузке данных). - Открыть сессию на время доступа к ленивым коллекциям (Open Session in View).
- Явно инициализировать коллекции внутри сессии с помощью
Hibernate.initialize()или запросов с join fetch.
Пример инициализации внутри сессии:
Session session = sessionFactory.openSession();
User user = session.get(User.class, userId);
Hibernate.initialize(user.getOrders()); // инициализация ленивой коллекции
session.close();
// теперь можно безопасно обращаться к user.getOrders()