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

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

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

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

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

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

session.update(object);

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

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

Ответ 4

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

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.