2013-02-28 5 views
2

Мы получаем org.hibernate.LazyInitializationException в нашем приложении wicket/spring/hibernate. Это случается редко, возможно, каждые 100 раз код запускается.LazyInitializationException при доступе к @Id

Во-первых, мы получили исключение, когда получили доступ к данным ленивых загружаемых объектов (также примерно каждые 100 раз, когда код запускается). Поэтому мы решили, что проблема будет исправлена, если мы вручную загрузим объект в память, извлекая его из базы данных с ее идентификатором. Наше понимание состоит в том, что поле, аннотированное с javax.persistence.Id, должно всегда быть в памяти. К нашему удивлению, мы по-прежнему получаем исключение при доступе к 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) номер. Сначала мы сделали это:

dimensionHolder.getMyDim().getNumber(); 

Это вызвало (каждый сотый раз) ленивые инициализации исключения на .getNumber(). Это когда мы попытались загрузить его вручную перед обращающимся номером:

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

Это до сих пор вызывает ленивые инициализации исключения на .getUUID(). Даже если myDim является прокси-сервером, не должен ли идентификатор оставаться доступным?

Возможно ли, что проблема заключается в том, что идентификатор находится в классе Superments и что текущий экземпляр Dimension, который мы используем, является прокси-объектом из спящего режима? Это звучит странно и в наших ушах, так что, может быть, какая-то душа может пролить свет на нашу проблему?

Спасибо!

EDIT: вот StackTrace:

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

+1

LazyInitializationException всегда происходит, когда вы закрываете сеансы перед первым доступом к дочерним элементам, которые загружаются ленивой загрузкой. Снюплер кода недостаточно длинный, чтобы увидеть, где это может произойти. – Johanna

+0

Добавлен стек. – bumaklion

ответ

0

AFAIK, прокси инициализируется, независимо от метода, который вы вызываете. И для этого может быть веская причина. Например, ваш метод getId() может содержать следующие инструкции:

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

Если прокси-сервер не был инициализирован, вошедшее имя будет нулевым, что было бы неправильно.

Я читал где-то, что прокси не инициализируется при вызове getId(), если вы используете тип доступа к свойствам, а не тип доступа к полю (т. Е. Если ваши геттеры аннотируются аннотациями сопоставления, превышающими ваши поля).

Но я бы просто инициализировал объект перед закрытием сессии вместо его инициализации после выдачи нового sessio и нового запроса к базе данных.

+0

«Если прокси-сервер не был инициализирован, зарегистрированное имя было бы нулевым, что было бы неверно». - Но это идентификатор, который мы пытаемся получить, а не имя. Из stacktrace: 'eyesys.domain.Dimension3 _ $$ _ javassist_17.getUUID (Dimension3 _ $$ _ javassist_17.java)'. – bumaklion

Смежные вопросы