2016-07-08 12 views
0
keine Session

Ich bin mit Java arbeiten 1.8 in einer Beziehung zwischen Entitäten @OneToMany und @ManyToOne mit Frühlings-MVC und Frühlings-Data-JPA, aber ich bin immer folgende Fehler:gescheitert träge, um eine Sammlung von Rolle zu initialisieren: br.com.coderi.adi.model.Usuario.papeis, nicht Proxy initialisieren konnte -

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 

ich einen Benutzer hinzufügen kann (Usuario) und ihre Rollen (Papeis), aber die Abfrage ausführen bekomme immer den obigen Fehler.

Entity Usuario:

@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... --> 
} 

Entity Papel:

@Entity 
public class Papel { 

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

    @NotEmpty 
    private String papel; 

    @ManyToOne 
    private Usuario usuario; 

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

ein Benutzer (Usuario) kann mehrere Rollen (Papel) haben, die verschiedenen Rollen zu a angehören Benutzer. Dies ist der richtige Ansatz?

Der Dienst:

@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); 
    } 
} 

Das Repository:

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

In meinem -Controller nach einem Benutzer das Hinzufügen/Rollen, wenn ich papelService.getPapel(1) ausführen bekomme ich diesen Fehler zitiert . Danke für Ihre Hilfe!

Ps: Der Fehler tritt nur auf, wenn die Methoden der Beziehungen verwendet werden.

Datenbank: Database

Alle Stack-Trace:

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

Ich denke, das Problem wurde nicht wegen dieser Zeile "papelService.getPapel (1)". etwas, wo, wenn Sie 'Usuario.getPapeis()' aufrufen, es den Fehler ausgelöst hat. Also müssen Sie Ihre Zuordnung zu '@ ​​OneToMany ändern (fetch = FetchType.EAGER, mappedBy =" usuario ")' –

+0

@ MaiHữuLợi können Sie genauer sein? So kann ich weitere Informationen hinzufügen. –

+0

Bitte sehen Sie meine Bearbeitung. –

Antwort

1

Wie Lazy Loading-in Hibernate aktivieren

Bevor Sie weitermachen, ist es wichtig, das Standardverhalten des Lazy Load im Falle der Verwendung von Hibernate Mappings vs Annotationen zu wiederholen.

Das Standardverhalten ist 'Eigenschaftswerte eifrig laden' und laden 'Sammlungen träge'. Im Gegensatz zu dem, was Sie sich vielleicht merken, wenn Sie verwendet haben, plain Hibernate 2 (Mapping-Dateien) zuvor, wo alle Referenzen (einschließlich Sammlungen) standardmäßig geladen werden. Beachten Sie außerdem, dass @ OneToMany- und @ ManyToMany-Verknüpfungen standardmäßig auf LAZY geladen werden. und @OneToOne und @ManyToOne werden standardmäßig auf EAGER geladen.Dies ist wichtig zu erinnern, um in Zukunft keine Fallstricke zu vermeiden.

verzögertes Laden aktivieren explizit Sie „holen = FetchType.LAZY“ verwenden muss auf einer Vereinigung, die Sie zu faul Last möchten, wenn Sie Hibernate Annotations verwenden.

Ein Beispiel für die Verwendung wird wie folgt aussehen:

@OneToMany (mappedBy = "Kategorie", holen = FetchType.LAZY) private Set-Produkte; Ein weiteres Attribut parallel zu "FetchType.LAZY" ist "FetchType.EAGER", das genau entgegengesetzt zu LAZY ist, d. H. Es lädt auch die Assoziationseinheit, wenn die Eigentümerentität zum ersten Mal abgerufen wird.

Wie Lazy Loading-Werke in Hibernate

Der einfachste Weg, die Hibernate faul Lastverhalten ist auf Ihre Einheiten und Verbände durch die Bereitstellung einer Proxy-Implementierung von sie anwenden können. Hibernate fängt Aufrufe an die Entität ab, indem sie einen Proxy für ihn verwendet, der von der Klasse der Entität abgeleitet ist. Wenn die angeforderten Informationen fehlen, wird es aus der Datenbank geladen, bevor Kontrolle an die Implementierung der übergeordneten Entität übergeben wird.

Bitte beachten Sie, dass, wenn der Verband als eine Sammlung Klasse dargestellt wird, dann ist ein Wrapper (im Wesentlichen ein Proxy für die Sammlung, eher als für die Unternehmen, die sie enthält) erstellt wird und als Ersatz für die ursprüngliche Kollektion. Wenn Sie auf diesen Sammlungs-Proxy zugreifen, ist das, was Sie in zurückgegebener Proxy-Sammlung erhalten, keine Proxy-Entitäten. eher sind sie tatsächliche Entitäten. Sie müssen nicht viel Druck auf dieses Konzept zu verstehen, weil auf Laufzeit es kaum zählt.

Sie verwenden @OnetoMany Beziehung.

Ich weiß zu lösen.

Sie verwenden holen.

Ihr Unternehmen

@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... --> 
} 

Sie suchen "JPA faul holen". aber. holen, viele Suchbeziehungen. :)

+0

danke für Ihre Aufmerksamkeit. Funktioniert mit '@ OneToMany (mappedBy =" usuario ", fetch = FetchType.EAGER)', nicht jedoch mit 'FetchType.LAZY'. Du weißt, warum? –

+0

Ihre Wahl gut. nur ich möchte faul suchen. Ihr Fehler: Fehler beim Initialisieren einer Sammlung von Rollen. Warum passiert Fehler? – Byeon0gam

1

Der Grund, warum IT nicht funktioniert, ist, weil Ihre Sitzung geschlossen wird. Dies kann automatisch nach der Transaktion END geschehen. Dann tritt die Entität in den "gelösten" Zustand ein. Wenn dies geschieht, führt der Zugriff auf nicht initialisierte Lazy Proxies zu dieser Ausnahme. Die einfachste Lösung ist natürlich die Kennzeichnung von IT AS EAGER. Wenn Sie die IT dennoch träge halten möchten Um IT zu reparieren, müssen Sie diese Sammlung innerhalb einer Transaktion initialisieren, bevor die IT getrennt wird. Die Alternative, wenn Sie Ihren Dienst nicht in transactin umbrechen, besteht darin, die HQL-Abfrage mit fetch-Klausel zu verwenden, um sicherzustellen, dass die Sammlung initialisiert wird. Wenn Sie diese Schritte ausführen, können Sie die LAZY FetchType