2014-06-18 147 views
-2

我得到一个懒惰的初始化异常,我不明白...奇怪的懒惰初始化异常

我使用Java,Hibernate,Spring和Wicket。

因此,从Form的保存方法(扩展检票窗体)时,我得到一个LazyInitializationException当访问一个对象的集合,但马上我可以访问另一个具有相同“配置”触发该例外集合:

这里是代码的形式:

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

而且在这些地方集合类中定义的一部分:

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

“有问题”的收集是毒性收集。如果我先交换命令并调用毒性,它也会抛出LazyInitializationException。这个例外总是由毒性而不是治疗所解雇......为什么?

编辑:这里是堆栈跟踪

根源:

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)是我叫therapyGroup.getToxicities().add(lastTherapy.getToxicity());

+1

在同一行中有另一个呼叫:lastTherapy.getToxicity()。你确定这不是问题吗? – kostja

+1

如果没有完整的堆栈跟踪,包括所有“引起来”部分,则无法回答此问题。就在昨天,我看到了这个确切的例外,其中“Caused By”显示数据库连接失败,即原因与代码无关。这可能不是你的问题,但除非我们能看到整个堆栈跟踪,否则答案可能是任何事情。 –

+0

我已经添加了完整的堆栈跟踪。 – diminuta

回答

0

我用它来获得这种例外的时候我忘了写的行@Transaction注释在我的服务类。

1

在两种方法中设置断点。当你运行代码时,你会发现在某个地方,getTherapies()在一个事务中被调用。这意味着你有一个集合,当你调用save()中的方法时,Hibernate将使用它而不是从数据库中加载它。

对于getToxicities()也是如此。所以Hibernate试图加载它,但没有当前事务,所以加载失败。所以请确保save()从某处获取事务。也许你忘了某个地方的注释?

相关问题