Sobes.tech
Back to questions
Junior — Middle
62

Что означает исключение LazyInitializationException и в каких ситуациях оно возникает при работе с ORM?

Companies where asked
AstonAston
СБЕР дейвайсыСБЕР дейвайсы

Answer from AI

sobes.tech AI

Исключение LazyInitializationException возникает в ORM (например, Hibernate), когда пытаются получить доступ к лениво загруженному (lazy) связанному объекту вне сессии или транзакции, в которой этот объект был загружен.

Это происходит, если объект с ленивой загрузкой был загружен, но сессия уже закрыта, и ORM не может подгрузить связанные данные из базы. Например, если у вас есть сущность с коллекцией, помеченной как fetch = FetchType.LAZY, и вы пытаетесь обратиться к этой коллекции после закрытия сессии, то получите LazyInitializationException.

Чтобы избежать этой ошибки, можно:

  • Использовать жадную загрузку (FetchType.EAGER), если это оправдано.
  • Открывать сессию на время работы с объектами (Open Session in View).
  • Явно инициализировать ленивые коллекции или свойства внутри сессии (например, с помощью Hibernate.initialize() или запросов с join fetch).

Пример:

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
User user = session.get(User.class, userId); // user.getOrders() - ленивое поле
tx.commit();
session.close();

// Здесь вызов user.getOrders() вызовет LazyInitializationException, так как сессия закрыта
List<Order> orders = user.getOrders();