2010-08-06 13 views
0

Je construis un projet avec Stripes, Spring, JPA & Hibernate et ai un objet avec une collection de plusieurs enfants. J'ai mis le chargement comme Lazy par exemple.JPA - Chargement paresseux - LazyInitializationException - Quand ne pas accéder à la collection enfant

@OneToMany(cascade = CascadeType.MERGE, mappedBy = "paperOffering", fetch = FetchType.LAZY) 
private List<PaperOfferingAssessment> paperOfferingAssessments; 

Maintenant, je reçois le LazyInitializationException quand je reçois une collection de ces objets de la base de données, même si à aucun moment que j'accéder directement à la collection des enfants.

Je pensais que le chargement paresseux signifiait qu'il instancierait seulement la collection d'objets enfants quand elle était référencée? J'ai essayé de regarder un problème similaire, mais je ne peux pas comprendre toute cette question, donc j'apprécierais toute clarification. La chose amusante est que j'ai toujours eu cette relation mise en place mais seulement réellement remarqué l'exception quand j'ai changé la base de données pour avoir une bonne relation de clé étrangère avec la table enfant.

Edit: Stack Trace:

Stack Trace:

17:39:17] ERROR org.hibernate.LazyInitializationException - failed to lazily initialize a collection of role: eis.model.PaperOffering.paperOfferingAssessments, no session or session was closed 
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: eis.model.PaperOffering.paperOfferingAssessments, no session or session was closed 
    at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:380) 
    at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:372) 
    at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:365) 
    at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:108) 
    at org.hibernate.collection.PersistentSet.toArray(PersistentSet.java:194) 
    at net.sourceforge.stripes.ajax.JavaScriptBuilder.buildCollectionNode(JavaScriptBuilder.java:524) 
    at net.sourceforge.stripes.ajax.JavaScriptBuilder.buildNode(JavaScriptBuilder.java:365) 
    at net.sourceforge.stripes.ajax.JavaScriptBuilder.buildObjectNode(JavaScriptBuilder.java:420) 
    at net.sourceforge.stripes.ajax.JavaScriptBuilder.buildNode(JavaScriptBuilder.java:374) 
    at net.sourceforge.stripes.ajax.JavaScriptBuilder.buildArrayNode(JavaScriptBuilder.java:507) 
    at net.sourceforge.stripes.ajax.JavaScriptBuilder.buildCollectionNode(JavaScriptBuilder.java:524) 
    at net.sourceforge.stripes.ajax.JavaScriptBuilder.buildNode(JavaScriptBuilder.java:365) 
    at net.sourceforge.stripes.ajax.JavaScriptBuilder.build(JavaScriptBuilder.java:191) 
    at net.sourceforge.stripes.ajax.JavaScriptResolution.execute(JavaScriptResolution.java:75) 
    at net.sourceforge.stripes.controller.DispatcherHelper$7.intercept(DispatcherHelper.java:508) 
    at net.sourceforge.stripes.controller.ExecutionContext.proceed(ExecutionContext.java:158) 
    at net.sourceforge.stripes.controller.HttpCacheInterceptor.intercept(HttpCacheInterceptor.java:99) 
    at net.sourceforge.stripes.controller.ExecutionContext.proceed(ExecutionContext.java:155) 
    at net.sourceforge.stripes.controller.BeforeAfterMethodInterceptor.intercept(BeforeAfterMethodInterceptor.java:113) 
    at net.sourceforge.stripes.controller.ExecutionContext.proceed(ExecutionContext.java:155) 
    at net.sourceforge.stripes.controller.ExecutionContext.wrap(ExecutionContext.java:74) 
    at net.sourceforge.stripes.controller.DispatcherHelper.executeResolution(DispatcherHelper.java:502) 
    at net.sourceforge.stripes.controller.DispatcherServlet.executeResolution(DispatcherServlet.java:286) 
    at net.sourceforge.stripes.controller.DispatcherServlet.service(DispatcherServlet.java:170) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) 
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:527) 
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1216) 
    at net.sourceforge.stripes.controller.StripesFilter.doFilter(StripesFilter.java:247) 
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1187) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:343) 
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109) 
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:97) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
    at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:100) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
    at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:78) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
    at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
    at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:35) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
    at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:188) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
    at org.springframework.security.web.session.ConcurrentSessionFilter.doFilter(ConcurrentSessionFilter.java:109) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:149) 
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) 
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) 
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1187) 
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:421) 
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119) 
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:493) 
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:225) 
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:930) 
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:358) 
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:183) 
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:866) 
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117) 
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:245) 
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:126) 
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:113) 
    at org.eclipse.jetty.server.Server.handle(Server.java:351) 
    at org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:594) 
    at org.eclipse.jetty.server.HttpConnection$RequestHandler.content(HttpConnection.java:1059) 
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:764) 
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:217) 
    at org.eclipse.jetty.server.HttpConnection.handle(HttpConnection.java:424) 
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:506) 
    at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:436) 
    at java.lang.Thread.run(Thread.java:619) 
[17:39:17] WARN net.sourceforge.stripes.ajax.JavaScriptBuilder - Could not translate property [paperOfferingAssessments] of type [java.util.Set] due to an exception. 
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: eis.model.PaperOffering.paperOfferingAssessments, no session or session was closed 
    at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:380) 
    at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:372) 
    at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:365) 
    at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:108) 
    at org.hibernate.collection.PersistentSet.toArray(PersistentSet.java:194) 
    at net.sourceforge.stripes.ajax.JavaScriptBuilder.buildCollectionNode(JavaScriptBuilder.java:524) 
    at net.sourceforge.stripes.ajax.JavaScriptBuilder.buildNode(JavaScriptBuilder.java:365) 
    at net.sourceforge.stripes.ajax.JavaScriptBuilder.buildObjectNode(JavaScriptBuilder.java:420) 
    at net.sourceforge.stripes.ajax.JavaScriptBuilder.buildNode(JavaScriptBuilder.java:374) 
    at net.sourceforge.stripes.ajax.JavaScriptBuilder.buildArrayNode(JavaScriptBuilder.java:507) 
    at net.sourceforge.stripes.ajax.JavaScriptBuilder.buildCollectionNode(JavaScriptBuilder.java:524) 
    at net.sourceforge.stripes.ajax.JavaScriptBuilder.buildNode(JavaScriptBuilder.java:365) 
    at net.sourceforge.stripes.ajax.JavaScriptBuilder.build(JavaScriptBuilder.java:191) 
    at net.sourceforge.stripes.ajax.JavaScriptResolution.execute(JavaScriptResolution.java:75) 
    at net.sourceforge.stripes.controller.DispatcherHelper$7.intercept(DispatcherHelper.java:508) 
    at net.sourceforge.stripes.controller.ExecutionContext.proceed(ExecutionContext.java:158) 
    at net.sourceforge.stripes.controller.HttpCacheInterceptor.intercept(HttpCacheInterceptor.java:99) 
    at net.sourceforge.stripes.controller.ExecutionContext.proceed(ExecutionContext.java:155) 
    at net.sourceforge.stripes.controller.BeforeAfterMethodInterceptor.intercept(BeforeAfterMethodInterceptor.java:113) 
    at net.sourceforge.stripes.controller.ExecutionContext.proceed(ExecutionContext.java:155) 
    at net.sourceforge.stripes.controller.ExecutionContext.wrap(ExecutionContext.java:74) 
    at net.sourceforge.stripes.controller.DispatcherHelper.executeResolution(DispatcherHelper.java:502) 
    at net.sourceforge.stripes.controller.DispatcherServlet.executeResolution(DispatcherServlet.java:286) 
    at net.sourceforge.stripes.controller.DispatcherServlet.service(DispatcherServlet.java:170) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) 
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:527) 
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1216) 
    at net.sourceforge.stripes.controller.StripesFilter.doFilter(StripesFilter.java:247) 
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1187) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:343) 
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109) 
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:97) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
    at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:100) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
    at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:78) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
    at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
    at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:35) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
    at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:188) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
    at org.springframework.security.web.session.ConcurrentSessionFilter.doFilter(ConcurrentSessionFilter.java:109) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:149) 
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) 
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) 
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1187) 
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:421) 
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119) 
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:493) 
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:225) 
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:930) 
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:358) 
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:183) 
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:866) 
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117) 
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:245) 
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:126) 
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:113) 
    at org.eclipse.jetty.server.Server.handle(Server.java:351) 
    at org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:594) 
    at org.eclipse.jetty.server.HttpConnection$RequestHandler.content(HttpConnection.java:1059) 
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:764) 
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:217) 
    at org.eclipse.jetty.server.HttpConnection.handle(HttpConnection.java:424) 
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:506) 
    at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:436) 
    at java.lang.Thread.run(Thread.java:619) 
+0

@mrtrombone post stacktrace et comment voulez-vous récupérer votre entité –

+0

Les entités sont extraites à l'aide d'une base nommée requête - "sélectionnez p de paperoffering p où year =: année" Dans ce cas particulier, je n'utilise que le nom et le champ d'id pour remplir la liste de sélection, donc je devrais peut-être créer un simple DTO mais je veux juste comprendre d'abord – Mark

Répondre

0

Etes-vous sûr que vous n'accédez pas la collection dans le toString, hashCode ou égal-méthodes? Le dernier 2 pourrait être utilisé par hibernate pour ajouter les résultats à son cache.

+0

't - bien sûr, l'objet enfant (paperofferingassessment) utilise la paperoffering dans le hashcode et est égal mais cela causerait un problème - toujours la même question sur pourquoi est-il instancié du tout – Mark

1

Lazy signifie que les éléments de collection seront chargés lorsque quelqu'un appellera get(index) ou toute autre méthode qui doit fonctionner avec une collection entièrement initialisée. size() n'initialise pas la collection.

Votre erreur signifie que votre code, qui essaie d'obtenir un élément de la collection, travaille en dehors de la session Hibernate. La session a été fermée quelque temps avant que vous obteniez la collection détachée paresseuse.

Veuillez vérifier que le code qui fonctionne avec la collecte est exécuté dans la transaction. Peut-être, yoiu'll besoin de marquer votre méthode avec @Transactional annotation (si vous en utilisant la description déclarative) ou placez-vous code dans

TransactionManager tm = //get TransactionManager 
try { 
    tm.begin(); 
    //your code 
    tm.commit(); 
} catch (Exception e) { 
    tm.rollback(); 
} 
Questions connexes