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.