Hibernate: org.hibernate.LazyInitializationException: no se pudo inicializar el proxy – sin Session

Tener la siguiente consulta a la base de datos:

Session session = EmployeesDAO.getSessionFactory().getCurrentSession(); List employees = new ArrayList(); try { session.beginTransaction(); String hqlQuery = "from Employee emp " + "left join fetch emp.employeesOffices employeesOffice " + "left join fetch employeesOffice.office employeesOfficeOffice " + "left join fetch employeesOfficeOffice.company " + "left join fetch emp.address empAddress " + "left join fetch empAddress.city empAddressCity " + "left join fetch empAddressCity.country"; Query empQuery = session.createQuery(hqlQuery); empQuery.setMaxResults(maxResult); employees = (List) empQuery.list(); session.getTransaction().commit(); } catch (HibernateException e) { session.getTransaction().rollback(); e.printStackTrace(); } 

Al buscar employee.address.street, employee.address.houseNumber o employee.address.city, falla con la excepción:

 org.hibernate.LazyInitializationException: could not initialize proxy - no Session at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:164) at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:285) at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185) at com.employees.model.Address_$$_javassist_6.getCity(Address_$$_javassist_6.java) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at javax.el.BeanELResolver.getValue(BeanELResolver.java:87) at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:67) at org.apache.el.parser.AstValue.getValue(AstValue.java:169) at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189) at org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:985) at org.apache.jsp.WEB_002dINF.listEmployees_jsp._jspx_meth_c_005fout_005f3(listEmployees_jsp.java:306) at org.apache.jsp.WEB_002dINF.listEmployees_jsp._jspx_meth_c_005fforEach_005f1(listEmployees_jsp.java:248) at org.apache.jsp.WEB_002dINF.listEmployees_jsp._jspx_meth_c_005fforEach_005f0(listEmployees_jsp.java:155) at org.apache.jsp.WEB_002dINF.listEmployees_jsp._jspService(listEmployees_jsp.java:89) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334) at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:690) at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:477) at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:402) at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:329) at com.employees.controller.EmployeeController.processRequest(EmployeeController.java:69) at com.employees.controller.EmployeeController.doGet(EmployeeController.java:30) at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) 

Mapeo para el empleado:

       EMP_SEQ            

Mapeo de dirección:

       ADDRESS_SEQ        

Es absolutamente normal con otras clases (Office, Company, etc.). Si comenta las líneas que cargan los campos de dirección en la aplicación jsp, funciona sin excepciones. ¿Qué pasa? Por cierto, muestra toda la información en jsp a pesar de la excepción.

Sus objetos dentro del employee son inicializados lazy . Eso es malo, se están inicializando solo a demanda en una sesión no cerrada. Por lo tanto, debe inicializarlos todos manualmente dentro del ciclo después de obtenerlos de DB:

 Query empQuery = session.createQuery(hqlQuery); empQuery.setMaxResults(maxResult); employees = (List) empQuery.list(); for (Employee emp : employees) { Hibernate.initialize(emp.address); } 

Sinche Hibernate 4.2 puede usar

 .setProperty("hibernate.enable_lazy_load_no_trans", "true"); 

esta opción resuelve lo temido

 org.hibernate.LazyInitializationException: could not initialize proxy - no Session 

lo que llevó muchas horas de vida a los progtwigdores de distancia.

No tiene nada que ver con el mapeo. Cuando proporciona carga diferida en un objeto, acepta una responsabilidad que ha hechizado al mundo ORM durante una década: que la sesión que cargó con el objeto será la misma que la sesión presente cuando se emiten las solicitudes vagas.

En tu caso, parece que la sesión se ha ido por completo.

Debe tener algún medio de mantener la sesión (lo que a menudo lleva a una necesidad de scope de conversación, lo que significa Seam o CDI (en EE 6)) o tiene que resincronizar su objeto con la nueva sesión que tiene ( usualmente al buscarlo de nuevo).

agrega laze=false en o puedes iniciar tu objeto en Hibernate.init (Object) cuando obtienes object de db