org.hibernate.LazyInitializationException в транзакции - PullRequest
2 голосов
/ 28 марта 2012

В настоящее время используется немного более старая версия Hibernate (3.3.2.GA) и получение исключения org.hibernate.LazyInitializationException в границах транзакции. Я подтвердил, что вызывающий метод помечен @Transactional, плюс трассировка стека во время исключения также показывает его: org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)

Тем не менее, попытка выполнить итерацию по @CollectionOfElements быстро вызывает исключение LazyInitializationException с "ни один сеанс или сеанс не был закрыт".

Во время отладки я вижу, что прокси Hibernate в соответствующей коллекции имеет нулевой сеанс виртуально, как только он загружается Hibernate. Это то, что беспокоиться? Как я могу отследить и устранить это - другими словами, во время отладки, как лучше всего отследить, что происходит с сеансом?

Очевидно, я понимаю, что изменение коллекции на Eager fetching решит проблему, но я скорее выясню, почему Lazy Load не работает, так как эта (потенциально) большая коллекция не нужна в большинстве сценариев.

Спасибо!

Ответы [ 3 ]

0 голосов
/ 10 марта 2014

adir1 У меня была точно такая же проблема.В моем случае проблема была вызвана тем фактом, что экземпляр, который содержал ленивую загруженную коллекцию, был ранее вручную удален (все в пределах границ транзакции).

0 голосов
/ 12 марта 2014

Относительно возраста этого вопроса, для потомков:

Та же самая проблема произошла для меня, потому что я держал объекты, сохраненные в памяти.Исключение было сгенерировано при обращении к этим объектам в более поздней транзакции - в отличие от той, во время которой объекты были впервые собраны.Отсюда проблема потерянного сеанса.

Решена путем настройки правильного кэширования 2-го уровня.

0 голосов
/ 28 марта 2012

Я предполагаю, что когда вы возвращаетесь из метода, извлекающего сущность, и начинаете итерацию по нему, вы уже находитесь в разных транзакционных контекстах, что приводит к проблеме отложенной инициализации; если вы используете DAO, попробуйте установить оба этих метода на одну и ту же транзакцию (т.е. установить их как REQUIRED).

Хотя я могу быть совершенно ошибочным. Я только что проверил это с EJB3 + JPA и получил ленивые проблемы инициализации, которые вы описали, когда метод извлечения сущности находился в другом транзакционном контексте.

РЕДАКТИРОВАТЬ: Как сказал Баба в своем комментарии, лучшим решением было бы либо стремление извлечь через HQL / Criteria (предложение выборки соединения в HQL), либо, менее предпочтительно, использование Hibernate.initialize перед возвратом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...