Исключение ленивой инициализации весной

#hibernate #spring #spring-mvc #spring-security #lazy-loading

#спящий режим #spring #spring-mvc #spring-безопасность #отложенная загрузка

Вопрос:

Я получаю исключение LazyInitializationException в моем приложении Spring. У меня настроен OpenEntityManagerInViewFilter, поэтому все мои отношения заданы как FetchType.ЛЕНИВЫЙ, и все они работают. Проблема заключается в том, когда я пытаюсь получить доступ к пользователю, который находится в сеансе, через Spring Security и напечатать отложенную информацию в JSP, что-то вроде этого:

 <sec:authentication property="principal" var="userAuth"/>
${userAuth.organisation.id}
  

и я получаю

 org.hibernate.LazyInitializationException: could not initialize proxy - no Session
  

хотя я могу выполнить ${UserAuth.username} без каких-либо проблем

У меня есть пользовательский поставщик аутентификации, который является просто DAO, который загружает пользователей с помощью Hibernate

  <sec:authentication-provider user-service-ref="userDAOImpl">
  

Странно то, что я получаю ту же проблему, когда устанавливаю для объекта organization значение EAGER .

Проблема возникает только тогда, когда я пытаюсь получить доступ через sec: аутентификацию. Если я добавлю пользователя в модель, а затем получу доступ к данным в jsp, это сработает.

Почему я не могу получить доступ к данным, хранящимся в объекте, связанном с пользователем?

Спасибо

Комментарии:

1. вы искали это исключение в stackoverflow?

Ответ №1:

Потому что вы извлекли основную информацию при входе пользователя в систему и сохранили их в сеансе http в этот момент.

Если вы попытаетесь получить доступ к неинициализированной коллекции этого объекта при любом последующем http-запросе, сеанс hibernate (где был выбран участник) будет закрыт (сразу после входа в систему), и вы получите исключение LazyInitializationException