2016-07-08 2 views
0

Я работаю с Java 1.8 в отношениях между субъектами @OneToMany и @ManyToOne с весна-MVC и Spring-Data-JPA, но я получаю следующие ошибки:не удалось инициализировать лениво коллекцию ролей: br.com.coderi.adi.model.Usuario.papeis, не удалось инициализировать прокси - не сессии

GRAVE: Servlet.service() for servlet [appServlet] in context with path [/adi] threw exception [Request processing failed; nested exception is org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: br.com.coderi.adi.model.Usuario.papeis, could not initialize proxy - no Session] with root cause 
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: br.com.coderi.adi.model.Usuario.papeis, could not initialize proxy - no Session 

Я могу добавить пользователя (Новичок) и их роли (Papeis), но для выполнения запроса всегда получайте вышеуказанную ошибку.

Сущность Новичок:

@Entity 
public class Usuario { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id; 

    @NotEmpty 
    private String nome; 

    @NotEmpty 
    private String email; 

    @NotEmpty 
    @Size(min = 2, max = 25) 
    @Column(unique = true) 
    private String login; 

    @NotEmpty 
    @Size(min = 6) 
    private String senha; 

    @Transient 
    private String confirmSenha; 

    private Boolean status; 

    @OneToMany(mappedBy = "usuario") 
    private List<Papel> papeis; 

    <!-- Getters/Setters... --> 
} 

Сущность Papel:

@Entity 
public class Papel { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id; 

    @NotEmpty 
    private String papel; 

    @ManyToOne 
    private Usuario usuario; 

    <!-- Getters/Setters... --> 
} 

Пользователь (Новичок) может иметь несколько ролей (Papel), различные роли должны принадлежать к пользователь. Это правильный подход?

Сервис:

@Service 
public class PapelService { 

    @Autowired 
    private PapelReposiroty papelRepository; 

    public Papel getPapel(Integer id) { 
     return papelRepository.findOne(id); 
    } 

    public Papel adicionar(Papel papel) { 
     return papelRepository.save(papel); 
    } 

    public List<Papel> listarPapeisPorUsuario(Usuario usuario) { 
     return papelRepository.findPapelByUsuario(usuario); 
    } 
} 

Repository:

@Repository 
public interface PapelReposiroty extends CrudRepository<Papel, Integer> { 
    public List<Papel> findPapelByUsuario(Usuario usuario); 
} 

В моей контроллер после добавления пользователя/роли, когда я исполняю papelService.getPapel(1) я получаю цитированные ошибку , Спасибо за вашу помощь!

Пс: Ошибка возникает только при использовании методов отношений.

Database: Database

Все трассировки стека:

GRAVE: Servlet.service() for servlet [appServlet] in context with path [/adi] threw exception [Request processing failed; nested exception is org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: br.com.coderi.adi.model.Usuario.papeis, could not initialize proxy - no Session] with root cause 
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: br.com.coderi.adi.model.Usuario.papeis, could not initialize proxy - no Session 
at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:579) 
at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:203) 
at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:558) 
at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:131) 
at org.hibernate.collection.internal.PersistentBag.toString(PersistentBag.java:509) 
at java.lang.String.valueOf(String.java:2982) 
at java.lang.StringBuilder.append(StringBuilder.java:131) 
at br.com.coderi.adi.model.Usuario.toString(Usuario.java:113) 
at java.lang.String.valueOf(String.java:2982) 
at java.lang.StringBuilder.append(StringBuilder.java:131) 
at br.com.coderi.adi.model.Papel.toString(Papel.java:66) 
at java.lang.String.valueOf(String.java:2982) 
at java.io.PrintStream.println(PrintStream.java:821) 
at org.apache.tomcat.util.log.SystemLogHandler.println(SystemLogHandler.java:267) 
at br.com.coderi.adi.controller.PapelController.adicionarForm(PapelController.java:39) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:497) 
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) 
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136) 
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:114) 
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) 
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) 
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) 
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) 
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) 
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:622) 
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:317) 
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127) 
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:115) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:112) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:169) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilterInternal(BasicAuthenticationFilter.java:158) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:206) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:121) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
at org.springframework.security.web.csrf.CsrfFilter.doFilterInternal(CsrfFilter.java:100) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:66) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:106) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214) 
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:177) 
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) 
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:673) 
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1526) 
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1482) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
at java.lang.Thread.run(Thread.java:745) 
+1

Я думаю, проблема не в этой строке 'papelService.getPapel (1)'. некоторые, где, когда вы вызываете 'Usuario.getPapeis()', он вызывает ошибку. Поэтому вам нужно изменить свое сопоставление на '@OneToMany (fetch = FetchType.EAGER, mappedBy =" usuario ")' –

+0

@ MaiHữuLợi вы можете быть более конкретным? Поэтому я могу добавить дополнительную информацию. –

+0

См. Мое редактирование. –

ответ

1

Как включить отложенную загрузку в Hibernate

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

Поведение по умолчанию - загрузить «значения свойств с нетерпением» и загрузить «коллекции lazily». Вопреки тому, что вы могли бы вспомнить, если у вас есть , используйте обычный Hibernate 2 (файлы сопоставления) раньше, где по умолчанию загружаются все ссылки (включая коллекции). Также обратите внимание, что ассоциации @OneToMany и @ManyToMany по умолчанию не загружены LAZY; и @OneToOne и @ManyToOne дефолтны для загрузки EAGER.Это важно помнить, чтобы избежать каких-либо ошибок в будущем.

Для включения отложенной загрузки явно вы должны использовать «выборку = FetchType.LAZY» на ассоциацию, которое вы хотите ленивую нагрузку при использования Hibernate аннотации.

Пример использование будет выглядеть следующим образом:

@OneToMany (mappedBy = "категория", принесите = FetchType.LAZY) частные Наборы продуктов; Другой атрибут, параллельный , «FetchType.LAZY» - это «FetchType.EAGER», который находится прямо напротив LAZY , т. Е. Он будет загружать объект объединения, а также когда объект-владелец выбирается впервые.

Как Ленивая Загрузка Работает в Hibernate

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

Пожалуйста, обратите внимание, что, когда ассоциация представлена ​​как класс коллекции , то обертка (в основном прокси-сервер для сбора, а , чем для лиц, которые она содержит) создается и заменить оригинальной коллекции. Когда вы получаете доступ к этому прокси-серверу, то то, что вы получаете внутри возвращенной коллекции прокси, не является прокси-сущностями; скорее они являются фактическими сущностями. Вы не должны сильно надавливать на эту концепцию, потому что во время выполнения это не имеет большого значения.

Вы используете @OnetoMany отношение.

Я знаю, что нужно решить.

Вы используете fetch.

Ваше предприятие

@Entity 
public class Usuario { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id; 

    @NotEmpty 
    private String nome; 

    @NotEmpty 
    private String email; 

    @NotEmpty 
    @Size(min = 2, max = 25) 
    @Column(unique = true) 
    private String login; 

    @NotEmpty 
    @Size(min = 6) 
    private String senha; 

    @Transient 
    private String confirmSenha; 

    private Boolean status; 

    @OneToMany(mappedBy = "usuario") 
    private List<Papel> papeis; 

    <!-- Getters/Setters... --> 
} 

Вы искали "JPA принести ленивым". но. выборка, много поиск отношение. :)

+0

благодарит за внимание. Работает с '@OneToMany (mappedBy =" usuario ", fetch = FetchType.EAGER)', но не с 'FetchType.LAZY'. Ты знаешь почему? –

+0

Ваш выбор хорошо. просто я хочу искать ленивый. ваша ошибка: не удалось лениво инициализировать коллекцию роли. почему происходит ошибка? – Byeon0gam

1

Причина, по которой ИТ не работает, заключается в том, что ваша сессия закрывается. Это может произойти автоматически после транзакции END. Затем субъект переходит в «отсоединенное» состояние. Когда это произойдет, весь доступ к неинициализированным ленивым прокси приведет к этому исключению. Конечно, самым легким решением является отметка IT AS EAGER. Если вы хотите, чтобы ваш ленивый, хотя для исправления ИТ вам нужно инициализировать эту коллекцию в транзакции до того, как ИТ станет отсоединенным. Альтернатива, если вы не завершаете свою транзакцию в трансактине, заключается в использовании запроса HQL с предложением fetch для обеспечения инициализации коллекции. Если вы выполните следующие шаги, вы можете сохранить LAZY FetchType

Смежные вопросы