2013-02-28 35 views
2

我們在我們的wicket/spring/hibernate應用程序中發現了org.hibernate.LazyInitializationException。很少發生這種情況,也許每隔100代碼運行一次。首先,當我們訪問延遲加載的對象數據(大約每隔100次代碼運行時),我們就會得到異常。所以我們認爲如果我們手動將對象加載到內存中,通過使用其ID從數據庫中獲取它,問題就會得到解決。我們的理解是,註明javax.persistence.Id的字段應該始終在內存中。令我們驚訝的是,當訪問ID時,我們仍然會得到例外。也許一個例子更清楚..LazyInitializationException在訪問@Id時

這些都是我們的POJO的:

public abstract class SuperDimension{ 

    @Id 
    @GeneratedValue(generator = "Dimension_id_gen", strategy = GenerationType.TABLE) 
    @GenericGenerator(name = "Dimension_id_gen", strategy = "uuid") 
    protected String UUID; 

    /*getters, setters and abstract stuff*/ 

} 

public class Dimension extends SuperDimension{ 

    private String number; 

    /*getters, setters and overridden methods*/ 
} 

public class DimensionHolder{ 

    @OneToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "myDim") 
    private Dimension myDim; 

    /*getters, setters*/ 
} 

我們有DimensionHolder的一個實例,並希望得到它的尺寸(myDims)號。起初,我們這樣做:在.getNumber

dimensionHolder.getMyDim().getNumber(); 

這引起了(每100次)延遲初始化異常()。這是當我們試圖訪問數前手動加載它:

Dimension freshDimensionFromDataBase = dataBase.getDimensionFromUUID(dimensionHolder.getMyDim().getUUID); 
String number = freshDimensionFromDataBase.getNumber(); 

這還是引起了對.getUUID延遲初始化異常()。即使myDim是代理,是否該ID仍然可用?

是否有可能是id在Dimensions超類中,而且我們使用的Dimension的當前實例是來自hibernate的代理對象?這在我們耳中聽起來很奇怪,所以也許某種靈魂可以爲我們的問題提供一些啓示。

謝謝!

編輯:這裏的堆棧跟蹤:

Root cause: org.hibernate.LazyInitializationException: could not initialize proxy - no Session Root Cause Message: LazyInitializationException: could not initialize proxy - no Session 
Message: WicketRuntimeException: Method onRequest of interface org.apache.wicket.behavior.IBehaviorListener targeted at eyesys.web.invoice.invoice.InvoicePage$20 {event='onclick'} on component [WebMarkupContainer [Component id = okayButton]] threw an exception 
    at org.apache.wicket.RequestListenerInterface.internalInvoke(RequestListenerInterface.java:270) 
    at org.apache.wicket.RequestListenerInterface.invoke(RequestListenerInterface.java:241) 
    at org.apache.wicket.request.handler.ListenerInterfaceRequestHandler.invokeListener(ListenerInterfaceRequestHandler.java:255) 
    at org.apache.wicket.request.handler.ListenerInterfaceRequestHandler.respond(ListenerInterfaceRequestHandler.java:234) 
    at org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor.respond(RequestCycle.java:781) 
    at org.apache.wicket.request.RequestHandlerStack.execute(RequestHandlerStack.java:64) 
    at org.apache.wicket.request.cycle.RequestCycle.execute(RequestCycle.java:255) 
    at org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java:212) 
    at org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:283) 
    at org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:185) 
    at org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) 
    at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:879) 
    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:600) 
    at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1703) 
    at java.lang.Thread.run(Thread.java:662) 
Caused by: 

    at sun.reflect.GeneratedMethodAccessor78.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.wicket.RequestListenerInterface.internalInvoke(RequestListenerInterface.java:260) 
    at org.apache.wicket.RequestListenerInterface.invoke(RequestListenerInterface.java:241) 
    at org.apache.wicket.request.handler.ListenerInterfaceRequestHandler.invokeListener(ListenerInterfaceRequestHandler.java:255) 
    at org.apache.wicket.request.handler.ListenerInterfaceRequestHandler.respond(ListenerInterfaceRequestHandler.java:234) 
    at org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor.respond(RequestCycle.java:781) 
    at org.apache.wicket.request.RequestHandlerStack.execute(RequestHandlerStack.java:64) 
    at org.apache.wicket.request.cycle.RequestCycle.execute(RequestCycle.java:255) 
    at org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java:212) 
    at org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:283) 
    at org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:185) 
    at org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) 
    at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:879) 
    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:600) 
    at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1703) 
    at java.lang.Thread.run(Thread.java:662) 
Caused by: 

    at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:167) 
    at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:215) 
    at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190) 
    at eyesys.domain.Dimension3_$$_javassist_17.getUUID(Dimension3_$$_javassist_17.java) 
    at eyesys.web.invoice.invoice.lines2.AccountingLineRow$33.validate(AccountingLineRow.java:918) 
    at org.apache.wicket.markup.html.form.Form.validateFormValidator(Form.java:1826) 
    at org.apache.wicket.markup.html.form.Form.validateFormValidators(Form.java:1839) 
    at org.apache.wicket.markup.html.form.Form$17.component(Form.java:1865) 
    at org.apache.wicket.markup.html.form.Form$17.component(Form.java:1853) 
    at org.apache.wicket.util.visit.Visits.visitPostOrderHelper(Visits.java:273) 
    at org.apache.wicket.util.visit.Visits.visitPostOrderHelper(Visits.java:261) 
    at org.apache.wicket.util.visit.Visits.visitPostOrderHelper(Visits.java:261) 
    at org.apache.wicket.util.visit.Visits.visitPostOrderHelper(Visits.java:261) 
    at org.apache.wicket.util.visit.Visits.visitPostOrderHelper(Visits.java:261) 
    at org.apache.wicket.util.visit.Visits.visitPostOrderHelper(Visits.java:261) 
    at org.apache.wicket.util.visit.Visits.visitPostOrderHelper(Visits.java:261) 
    at org.apache.wicket.util.visit.Visits.visitPostOrderHelper(Visits.java:261) 
    at org.apache.wicket.util.visit.Visits.visitPostOrderHelper(Visits.java:261) 
    at org.apache.wicket.util.visit.Visits.visitPostOrderHelper(Visits.java:261) 
    at org.apache.wicket.util.visit.Visits.visitPostOrderHelper(Visits.java:261) 
    at org.apache.wicket.util.visit.Visits.visitPostOrderHelper(Visits.java:261) 
    at org.apache.wicket.util.visit.Visits.visitPostOrderHelper(Visits.java:261) 
    at org.apache.wicket.util.visit.Visits.visitPostOrderHelper(Visits.java:261) 
    at org.apache.wicket.util.visit.Visits.visitPostOrderHelper(Visits.java:261) 
    at org.apache.wicket.util.visit.Visits.visitPostOrderHelper(Visits.java:261) 
    at org.apache.wicket.util.visit.Visits.visitPostOrderHelper(Visits.java:261) 
    at org.apache.wicket.util.visit.Visits.visitPostOrder(Visits.java:244) 
    at org.apache.wicket.markup.html.form.Form.validateNestedForms(Form.java:1851) 
    at org.apache.wicket.markup.html.form.Form.validate(Form.java:1715) 
    at org.apache.wicket.markup.html.form.Form.process(Form.java:803) 
    at org.apache.wicket.markup.html.form.Form.onFormSubmitted(Form.java:762) 
    at org.apache.wicket.ajax.form.AjaxFormSubmitBehavior.onEvent(AjaxFormSubmitBehavior.java:158) 
    at org.apache.wicket.ajax.AjaxEventBehavior.respond(AjaxEventBehavior.java:184) 
    at org.apache.wicket.ajax.AbstractDefaultAjaxBehavior.onRequest(AbstractDefaultAjaxBehavior.java:369) 
    at sun.reflect.GeneratedMethodAccessor78.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.wicket.RequestListenerInterface.internalInvoke(RequestListenerInterface.java:260) 
    at org.apache.wicket.RequestListenerInterface.invoke(RequestListenerInterface.java:241) 
    at org.apache.wicket.request.handler.ListenerInterfaceRequestHandler.invokeListener(ListenerInterfaceRequestHandler.java:255) 
    at org.apache.wicket.request.handler.ListenerInterfaceRequestHandler.respond(ListenerInterfaceRequestHandler.java:234) 
    at org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor.respond(RequestCycle.java:781) 
    at org.apache.wicket.request.RequestHandlerStack.execute(RequestHandlerStack.java:64) 
    at org.apache.wicket.request.cycle.RequestCycle.execute(RequestCycle.java:255) 
    at org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java:212) 
    at org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:283) 
    at org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:185) 
    at org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) 
    at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:879) 
    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:600) 
    at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1703) 
    at java.lang.Thread.run(Thread.java:662) 

AccountingLineRow = DimensionHolder。

Dimension3 =尺寸。

+0

你可以發佈stacktrace嗎? – ben75 2013-02-28 10:26:41

+1

LazyInitializationException總是在首次訪問由延遲加載加載的子元素之前關閉會話時發生。您的代碼sniplet不夠長,無法查看可能發生的情況。 – Johanna 2013-02-28 10:37:31

+0

添加了堆棧跟蹤。 – bumaklion 2013-02-28 12:57:12

回答

0

AFAIK,代理被初始化,無論您調用哪種方法。而且可能有充足的理由這樣做。例如,您的getId()方法可以包含以下說明:

public void getId() { 
    LOG.debug("getId() called for entity with ID " + this.id + " and name " + name); 
    return this.id; 
} 

如果代理未初始化,登錄名會是零,這是不正確的。

我讀過某處說,如果您使用屬性訪問類型而不是字段訪問類型(即,如果您的getter註釋的映射註釋比您的字段更精確),則在調用getId()時,代理未初始化。

但我只是在關閉會話之前初始化對象,而不是初始化它之後,通過發出新的sessio和新的數據庫查詢。

+0

「如果代理未初始化,則記錄的名稱將爲空,這將是不正確的。」 - 但這是我們試圖訪問的ID,而不是名稱。從stacktrace:'eyesys.domain.Dimension3 _ $$ _ javassist_17.getUUID(Dimension3 _ $$ _ javassist_17.java)'。 – bumaklion 2013-02-28 15:44:42