2014-06-18 2 views
-2

Je reçois une exception d'initialisation paresseuse que je ne comprends pas ...initialisation étrange Lazy exception

Je travaille avec Java, Hibernate, Spring et Wicket. Donc, à partir de la méthode save du formulaire (extends wicket Form) j'obtiens un LazyInitializationException quand j'accède à un colletion d'un objet, mais je peux immédiatement accéder à une autre collection du même objet qui a la même "configuration" que la collection qui déclenche l'exception:

Voici le code dans le formulaire:

therapyGroup.getTherapies().clear(); 
therapyGroup.getTherapies().addAll(therapiesOldGroup); 
therapyGroup.getToxicities().add(lastTherapy.getToxicity()); 

Et voici la partie où les collections sont définies dans la classe:

@OneToMany(mappedBy = "therapyGroup", fetch = FetchType.LAZY, orphanRemoval=true) 
@Cascade(value = { CascadeType.MERGE, CascadeType.PERSIST, CascadeType.DELETE, CascadeType.SAVE_UPDATE }) 
@OrderBy(value = "date asc") 
@Filters({ @Filter(name = "deletedFilter", condition = "deleted <> :deletedParam") }) 
@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL, region = "TherapyGroup") 
@Lazy 
public Set<Therapy> getTherapies() { 
    return therapies; 
} 


@OneToMany(mappedBy = "therapyGroup", fetch = FetchType.LAZY, orphanRemoval=true) 
@Cascade(value = { CascadeType.MERGE, CascadeType.PERSIST, CascadeType.DELETE, CascadeType.SAVE_UPDATE }) 
@OrderBy(value = "date asc") 
@Filters({ @Filter(name = "deletedFilter", condition = "deleted <> :deletedParam") }) 
@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL, region = "TherapyGroup") 
@Lazy 
public Set<Toxicity> getToxicities() { 
    return toxicities; 
} 

La collection "Problematic" est la collection toxicités. Si j'échange l'ordre et appelle les toxicités d'abord, il lance également le LazyInitializationException. L'exception est toujours tirée par les toxicités et non par les thérapies ... pourquoi?

EDIT: Voici la trace de la pile

cause racine:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.mycompany.myapp.data.TherapyGroup.toxicities, no session or session was closed 
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:383) 
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:375) 
at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:368) 
at org.hibernate.collection.PersistentSet.add(PersistentSet.java:212) 
at com.mycompany.myapp.web.support.therapyend.TherapyEndSupportForm.onSaveFormData(TherapyEndSupportForm.java:135) 
at com.mycompany.myapp.web.base.BaseForm.doSave(BaseForm.java:370) 
at com.mycompany.myapp.web.base.BaseForm.saveAndTrigger(BaseForm.java:1137) 
at com.mycompany.myapp.web.base.BaseForm.switchModalWindow(BaseForm.java:1128) 
at com.mycompany.myapp.web.base.BaseForm.switchModalWindow(BaseForm.java:1077) 
at com.mycompany.myapp.web.base.BaseForm.onSubmit(BaseForm.java:567) 
at com.mycompany.myapp.web.comp.QuasiAjaxSubmitButton.onSubmit(QuasiAjaxSubmitButton.java:49) 
at com.mycompany.myapp.web.comp.QuasiAjaxButton$1.onSubmit(QuasiAjaxButton.java:65) 
at com.mycompany.myapp.web.comp.QuasiAjaxFormSubmitBehavior.onEvent(QuasiAjaxFormSubmitBehavior.java:151) 
at org.apache.wicket.ajax.AjaxEventBehavior.respond(AjaxEventBehavior.java:177) 
at org.apache.wicket.ajax.AbstractDefaultAjaxBehavior.onRequest(AbstractDefaultAjaxBehavior.java:286) 
at org.apache.wicket.request.target.component.listener.BehaviorRequestTarget.processEvents(BehaviorRequestTarget.java:119) 
at org.apache.wicket.request.AbstractRequestCycleProcessor.processEvents(AbstractRequestCycleProcessor.java:92) 
at org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:1250) 
at org.apache.wicket.RequestCycle.step(RequestCycle.java:1329) 
at org.apache.wicket.RequestCycle.steps(RequestCycle.java:1428) 
at org.apache.wicket.RequestCycle.request(RequestCycle.java:545) 
at org.apache.wicket.protocol.http.WicketFilter.doGet(WicketFilter.java:479) 
at org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:312) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1139) 
at org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:113) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1139) 
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:378) 
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181) 
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:417) 
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
at org.mortbay.jetty.Server.handle(Server.java:324) 
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:535) 
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:880) 
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:747) 
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218) 
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 
at org.mortbay.jetty.bio.SocketConnector$Connection.run(SocketConnector.java:228) 
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:520) 

com.mycompany.myapp.web.support.therapyend.TherapyEndSupportForm.onSaveFormData(TherapyEndSupportForm.java:135) est la ligne où j'appelle therapyGroup.getToxicities().add(lastTherapy.getToxicity());

+1

il y a un autre appel dans la même ligne: lastTherapy.getToxicity(). Êtes-vous sûr que ce n'est pas le problème? – kostja

+1

Sans la trace complète de la pile, y compris toutes les sections "Causé par", il est impossible de répondre à cette question. Juste hier, j'ai vu cette exception exacte où le "Caused By" a montré que la connexion à la base de données a échoué, c'est-à-dire que la cause n'était pas liée au code. Ce n'est peut-être pas votre problème, mais à moins que nous puissions voir toute la trace de la pile, la réponse pourrait être n'importe quoi. –

+0

J'ai ajouté la trace complète de la pile. – diminuta

Répondre

0

j'utiliser pour obtenir ce genre d'exception quand j'ai oublié d'écrire le @Transaction annotation dans mon service Classes.

1

Définissez un point d'arrêt dans les deux méthodes. Lorsque vous exécutez le code, vous verrez que quelque part, getTherapies() est appelé à l'intérieur d'une transaction. Cela signifie que vous avez une collection là-bas et Hibernate utilisera cela au lieu d'essayer de le charger à partir de la base de données lorsque vous appelez la méthode à l'intérieur de save().

La même chose n'est pas vraie pour le getToxicities(). Donc, Hibernate essaie de le charger mais il n'y a pas de transaction en cours, donc le chargement échoue. Donc, assurez-vous que save() obtient une transaction de quelque part. Peut-être avez-vous oublié une annotation quelque part?