Sobes.tech
Назад к вопросам
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()