org.hibernate.LazyInitializationException: не удалось инициализировать прокси - нет сеанса - PullRequest
10 голосов
/ 05 октября 2011

У меня есть 2 физических сервера, на которые попадает мое веб-приложение, управляемых балансировщиком нагрузки.Я всегда получаю -

org.hibernate.LazyInitializationException: не удалось инициализировать прокси - нет сеанса

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

Использование lazy = false станет проблемой производительности, поскольку число строк в этой таблице достаточно велико.И, кстати, мы используем get (объект) в сеансе вместо load (объект).

Ответы [ 4 ]

13 голосов
/ 02 ноября 2012

Из предоставленных вами тегов, я понимаю, вы столкнулись с этой проблемой при использовании Spring Framework.Я столкнулся с тем же LazyInitializationException при использовании Spring Data org.springframework.data.jpa.repository.JpaRepository.

. Я решил проблему, аннотировав метод, который косвенно использует Hibernate для извлечения данных из базы данных с помощью @Transactional.

10 голосов
/ 05 октября 2011

Похоже, что столбец, к которому вы пытаетесь обратиться, настроен как какая-то ассоциация в вашей сущности (OneToMany, ManyToOne и т. Д.), И вы не заполняете эту ассоциацию в своей DAO. Затем, когда вы пытаетесь получить доступ к этому столбцу (в месте в вашем коде, где нет сеанса Hibernate), он не заполняется, Hibernate пытается загрузить его, и происходит бум.

Поскольку вы на самом деле используете данные в этой ассоциации, то их EAGER звучит как то, что вы на самом деле хотели бы сделать. И если эта таблица настолько велика, вы должны посмотреть на ее индексацию, чтобы запросы к ней были эффективными.

5 голосов
/ 05 октября 2011

Ваш объект отделен.Вам необходимо повторно присоединить его к текущему сеансу, прежде чем получить к нему доступ:

session.update(object);

Также убедитесь, что вы получаете доступ к нему в рамках транзакции

Подробнее о проблеме / решении здесь

0 голосов
/ 05 октября 2011

Является ли это ассоциацией или свойством - если это свойство, то проблема может заключаться в том, что на одном из серверов запущена неинструментированная версия.

Lazy attribute fetching: an attribute or single valued association is fetched when the instance variable is accessed. This approach requires buildtime bytecode instrumentation and is rarely necessary.
...