Sobes.tech
Junior — Middle
89

Was bedeutet die Ausnahme LazyInitializationException und in welchen Situationen tritt sie bei der Arbeit mit ORM auf?

Unternehmen wurden gefragt
AstonAston
СБЕР дейвайсыСБЕР дейвайсы

Antwort von AI

sobes.tech KI

Исключение 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();