#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