Как исправить Hibernate LazyInitializationException: не удалось лениво инициализировать набор ролей, не удалось инициали ⇐ JAVA
Как исправить Hibernate LazyInitializationException: не удалось лениво инициализировать набор ролей, не удалось инициали
В пользовательском AuthenticationProvider из моего весеннего проекта я пытаюсь прочитать список полномочий вошедшего в систему пользователя, но сталкиваюсь со следующей ошибкой:
org.hibernate.LazyInitializationException: не удалось лениво инициализировать коллекцию ролей: com.horariolivre.entity.Usuario.autorizacoes, не удалось инициализировать прокси — сеанс отсутствует в org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:566) в org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:186) в org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:545) в org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:124) в org.hibernate.collection.internal.PersistentBag.iterator(PersistentBag.java:266) в com.horariolivre.security.CustomAuthenticationProvider.authenticate(CustomAuthenticationProvider.java:45) в org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:156) в org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:177) в org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter.attemptAuthentication(UsernamePasswordAuthenticationFilter.java:94) в org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:211) в org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) в org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110) в org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) в org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:57) в org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) в org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) в org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87) в org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) в org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50) в org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) в org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) в org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192) в org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160) в org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:343) в org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:260) в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) в org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) в org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) в org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) в org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) в org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) в org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) в org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) в org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) в org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) в org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023) в org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) в org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) в java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) в java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) в java.lang.Thread.run(Thread.java:744) Читая другие темы здесь, в StackOverflow, я понимаю, что это происходит из-за того, как этот тип атрибута обрабатывается платформой, но я не могу найти никакого решения для моего случая. Кто-нибудь может указать, что я делаю неправильно и что я могу сделать, чтобы это исправить?
Код моего пользовательского поставщика аутентификации:
@Component публичный класс CustomAuthenticationProvider реализует AuthenticationProvider { @Autowired частный UsuarioHome usuario; общественный CustomAuthenticationProvider () { супер(); } @Override публичная аутентификация аутентификации (аутентификация аутентификации) выдает AuthenticationException { System.out.println("CustomAuthenticationProvider.authenticate"); Строковое имя пользователя = аутентификация.getName(); Строковый пароль = аутентификация.getCredentials().toString(); Пользователь Usuario = usuario.findByUsername(имя пользователя); если (пользователь != ноль) { if(user.getSenha().equals(пароль)) { List list = user.getAutorizacoes(); Список rolesAsList = новый ArrayList(); for(роль AutorizacoesUsuario: список){ rolesAsList.add(role.getAutorizacoes().getNome()); } List полномочия = новый ArrayList(); for (String role_name: rolesAsList) { авторитеты.add(новый SimpleGrantedAuthority(role_name)); } Аутентификация auth = новый UsernamePasswordAuthenticationToken (имя пользователя, пароль, полномочия); возврат авторизации; } еще { вернуть ноль; } } еще { вернуть ноль; } } @Override общедоступная логическая поддержка (аутентификация Class) { вернуть аутентификацию.equals(UsernamePasswordAuthenticationToken.class); } } Мои классы Entity:
UsuarioHome.java
@Entity @Table(name = "usuario") публичный класс Usuario реализует java.io.Serializable { частный внутренний идентификатор; личный вход в строку; частная строка сенха; частная строка primeiroNome; частная строка ultimoNome; частный список типоUsuarios = новый ArrayList(); частный список autorizacoes = новый ArrayList(); частный список dadosUsuarios = новый ArrayList(); частная конфигурация ConfigHorarioLivre; общественный Усуарио () { } public Usuario (String login, String senha) { this.login = вход; this.senha = сенха; } public Usuario (String login, String senha, String primeiroNome, String ultimoNome, List типоUsuarios, List autorizacoesUsuarios, List dadosUsuarios, ConfigHorarioLivre config) { this.login = вход; this.senha = сенха; this.primeiroNome = primeiroNome; this.ultimoNome = ultimoNome; this.tipoUsuarios = типоUsuarios; this.autorizacoes = autorizacoesUsuarios; this.dadosUsuarios = dadosUsuarios; this.config = конфигурация; } public Usuario(String login, String senha, String primeiroNome, String ultimoNome, String TipoUsuario, String[] Campos) { this.login = вход; this.senha = сенха; this.primeiroNome = primeiroNome; this.ultimoNome = ultimoNome; this.tipoUsuarios.add(new TipoUsuario(this, new Tipo(tipoUsuario))); for(int i=0; i @ Сущность @Table(name = "user_authorizations", uniqueConstraints = @UniqueConstraint(columnNames = "id")) публичный класс AuthorizeUsers реализует java.io.Serializable { частный внутренний идентификатор; частный пользователь; частные авторизации авторизации; общественный AuthorizeUsers () { } } public AuthorizeUsers (Пользователь-пользователь, авторизует, авторизует) { this.user = пользователь; this.authorizations = авторизации; } } @Идентификатор @Column(name = "id", unique = true, nullable = false) @GeneratedValue(strategy=GenerationType.AUTO); общественный int getId() { вернуть этот .id; } } общественный недействительный setId (int id) { this.id = идентификатор; } } @Один к одному @JoinColumn(name = "fk_user", nullable = false, вставляемый = false, обновляемый = false) публичный пользователь getUser() { верните этого пользователя; } } public void setUser (пользователь-пользователь) { this.user = пользователь; } } @Один к одному @JoinColumn(name = "fk_autorizacoes", nullable = false, вставляемый = false, обновляемый = false) публичные авторизации getAuthorizations() { верните это. } } public void setAuthorizations (авторизации авторизации) { this.authorizations = авторизации; } } } }
Авторизованный.java
< pre> @ Сущность @Table(name = "авторизации") Авторизация публичного класса реализует java.io.Serializable { частный внутренний идентификатор; частное имя строки; описание частной строки; общественная авторизация() { } } public Authorized(строковое имя) {; это.имя = имя; } } общедоступные авторизации (имя строки, описание строки) { это.имя = имя; это.описание = описание; } } @Идентификатор @Column(name = "id", unique = true, nullable = false) @GeneratedValue(strategy=GenerationType.AUTO); общественный int getId() { вернуть этот .id; } } общественный недействительный setId (int id) { this.id = идентификатор; } } @Column(name = "nome", nullable = false, length = 16) public String getName() { public String getName() { верните это .nome; } } public void setName (строковое имя) { public void setName (строковое имя) {; это.имя = имя; } } @Column(name = «описание», длина = 140) публичная строка getDescription() { вернуть это описание; } } public void setDescription (Описание строки) { это.описание = описание; } } } }
Полная версия проекта доступна на Github
--> https://github.com/klebermo/webapp_schedule_free
В пользовательском AuthenticationProvider из моего весеннего проекта я пытаюсь прочитать список полномочий вошедшего в систему пользователя, но сталкиваюсь со следующей ошибкой:
org.hibernate.LazyInitializationException: не удалось лениво инициализировать коллекцию ролей: com.horariolivre.entity.Usuario.autorizacoes, не удалось инициализировать прокси — сеанс отсутствует в org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:566) в org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:186) в org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:545) в org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:124) в org.hibernate.collection.internal.PersistentBag.iterator(PersistentBag.java:266) в com.horariolivre.security.CustomAuthenticationProvider.authenticate(CustomAuthenticationProvider.java:45) в org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:156) в org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:177) в org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter.attemptAuthentication(UsernamePasswordAuthenticationFilter.java:94) в org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:211) в org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) в org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110) в org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) в org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:57) в org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) в org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) в org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87) в org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) в org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50) в org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) в org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) в org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192) в org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160) в org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:343) в org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:260) в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) в org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) в org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) в org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) в org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) в org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) в org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) в org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) в org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) в org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) в org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023) в org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) в org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) в java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) в java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) в java.lang.Thread.run(Thread.java:744) Читая другие темы здесь, в StackOverflow, я понимаю, что это происходит из-за того, как этот тип атрибута обрабатывается платформой, но я не могу найти никакого решения для моего случая. Кто-нибудь может указать, что я делаю неправильно и что я могу сделать, чтобы это исправить?
Код моего пользовательского поставщика аутентификации:
@Component публичный класс CustomAuthenticationProvider реализует AuthenticationProvider { @Autowired частный UsuarioHome usuario; общественный CustomAuthenticationProvider () { супер(); } @Override публичная аутентификация аутентификации (аутентификация аутентификации) выдает AuthenticationException { System.out.println("CustomAuthenticationProvider.authenticate"); Строковое имя пользователя = аутентификация.getName(); Строковый пароль = аутентификация.getCredentials().toString(); Пользователь Usuario = usuario.findByUsername(имя пользователя); если (пользователь != ноль) { if(user.getSenha().equals(пароль)) { List list = user.getAutorizacoes(); Список rolesAsList = новый ArrayList(); for(роль AutorizacoesUsuario: список){ rolesAsList.add(role.getAutorizacoes().getNome()); } List полномочия = новый ArrayList(); for (String role_name: rolesAsList) { авторитеты.add(новый SimpleGrantedAuthority(role_name)); } Аутентификация auth = новый UsernamePasswordAuthenticationToken (имя пользователя, пароль, полномочия); возврат авторизации; } еще { вернуть ноль; } } еще { вернуть ноль; } } @Override общедоступная логическая поддержка (аутентификация Class) { вернуть аутентификацию.equals(UsernamePasswordAuthenticationToken.class); } } Мои классы Entity:
UsuarioHome.java
@Entity @Table(name = "usuario") публичный класс Usuario реализует java.io.Serializable { частный внутренний идентификатор; личный вход в строку; частная строка сенха; частная строка primeiroNome; частная строка ultimoNome; частный список типоUsuarios = новый ArrayList(); частный список autorizacoes = новый ArrayList(); частный список dadosUsuarios = новый ArrayList(); частная конфигурация ConfigHorarioLivre; общественный Усуарио () { } public Usuario (String login, String senha) { this.login = вход; this.senha = сенха; } public Usuario (String login, String senha, String primeiroNome, String ultimoNome, List типоUsuarios, List autorizacoesUsuarios, List dadosUsuarios, ConfigHorarioLivre config) { this.login = вход; this.senha = сенха; this.primeiroNome = primeiroNome; this.ultimoNome = ultimoNome; this.tipoUsuarios = типоUsuarios; this.autorizacoes = autorizacoesUsuarios; this.dadosUsuarios = dadosUsuarios; this.config = конфигурация; } public Usuario(String login, String senha, String primeiroNome, String ultimoNome, String TipoUsuario, String[] Campos) { this.login = вход; this.senha = сенха; this.primeiroNome = primeiroNome; this.ultimoNome = ultimoNome; this.tipoUsuarios.add(new TipoUsuario(this, new Tipo(tipoUsuario))); for(int i=0; i @ Сущность @Table(name = "user_authorizations", uniqueConstraints = @UniqueConstraint(columnNames = "id")) публичный класс AuthorizeUsers реализует java.io.Serializable { частный внутренний идентификатор; частный пользователь; частные авторизации авторизации; общественный AuthorizeUsers () { } } public AuthorizeUsers (Пользователь-пользователь, авторизует, авторизует) { this.user = пользователь; this.authorizations = авторизации; } } @Идентификатор @Column(name = "id", unique = true, nullable = false) @GeneratedValue(strategy=GenerationType.AUTO); общественный int getId() { вернуть этот .id; } } общественный недействительный setId (int id) { this.id = идентификатор; } } @Один к одному @JoinColumn(name = "fk_user", nullable = false, вставляемый = false, обновляемый = false) публичный пользователь getUser() { верните этого пользователя; } } public void setUser (пользователь-пользователь) { this.user = пользователь; } } @Один к одному @JoinColumn(name = "fk_autorizacoes", nullable = false, вставляемый = false, обновляемый = false) публичные авторизации getAuthorizations() { верните это. } } public void setAuthorizations (авторизации авторизации) { this.authorizations = авторизации; } } } }
Авторизованный.java
< pre> @ Сущность @Table(name = "авторизации") Авторизация публичного класса реализует java.io.Serializable { частный внутренний идентификатор; частное имя строки; описание частной строки; общественная авторизация() { } } public Authorized(строковое имя) {; это.имя = имя; } } общедоступные авторизации (имя строки, описание строки) { это.имя = имя; это.описание = описание; } } @Идентификатор @Column(name = "id", unique = true, nullable = false) @GeneratedValue(strategy=GenerationType.AUTO); общественный int getId() { вернуть этот .id; } } общественный недействительный setId (int id) { this.id = идентификатор; } } @Column(name = "nome", nullable = false, length = 16) public String getName() { public String getName() { верните это .nome; } } public void setName (строковое имя) { public void setName (строковое имя) {; это.имя = имя; } } @Column(name = «описание», длина = 140) публичная строка getDescription() { вернуть это описание; } } public void setDescription (Описание строки) { это.описание = описание; } } } }
Полная версия проекта доступна на Github
--> https://github.com/klebermo/webapp_schedule_free
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение