Tu problema es muy típico. Estas consultando una tabla pero no te traes sus relaciones. Luego, consultas esa relación y te salta el LazyInitializationException.
La solución más evidente es lo que estás haciendo, en la consulta te traes las relaciones con el left join fetch.
Existen otras opciones, definir un Persistence context del tipo PersistenceContextType.EXTENDED o pasarte a EclipseLink que te evita este tipo de errores.
Mi recomendación es que te centres en el problema. Haces una consulta de la cual no te traes las relaciones que luego necesitas, ergo traete las relaciones en la consulta. Es más rápido y óptimo que las demás soluciones.
Buen día,
Tengo un inconveniente, en un desarrollo web que estoy realizando.
Estoy usando :
Hibernate, Java, servicios web.
Tengo 2 proyectos:
1.-ServicioWeb .-Contiene los webservices
2.-Cliente .- consume los webservices
ServicioWeb
Este proyecto posee las entidades.java, entidades.hbm.xml, las configuraciones hibernate.cfg.xml y hibernate.reveng.xml
Por ejemplo:
Tengo la entidad SairBriAcciones que está relacionada con la entidad SairBriEstatus :
Tengo una clase prueba en el proyecto ServicioWeb para probar si funciona la consulta, la cual es la siguiente:
La prueba anterior si me funciona y me muestra la información, pero cunando agrego la siguiente linea, salta la excepción org.hibernate.LazyInitializationException: could not initialize proxy - no Session:
La excepción es la siguiente:
Así que investigue, investigue ,investigue ... y encontre 2 soluciones:
<ol><li>Usar join fetch en las consultas cuando se desea consultar alguna entidad relacionada</li>
<li>Activar el atributo lazy="false" en el archivo </li></ol>
Probé ambas y funcionaron, asi que decidi utilizar la primera porque la segunda opción (según lo que investigue) siempre te trae la información de la entidad relacionada haciendo que el rendimiento sea vea afectado, en cambio la primera solo se trae la información cuando usas el join fetch.
Por ejemplo de las dos clases pruebas anteriores:
Aplicando la primera solución para la consulta sin el join fetch, esta solo trae la tabla la información de SairBriAcciones y no la SairBriEstatus(estaría bien porque solo necesito la tabla SairBriAcciones ), para la segunda consulta aplicando el join fetch trae la información de ambas SairBriAcciones y SairBriEstatus porque yo se lo dije que la traiga por medio del join fetch.
Ahora aplicando la segunda solución del atributo lazy="false" para la consulta sin el join fetch este trae la información de ambas tablas SairBriAcciones y SairBriEstatus, entonces aqui es donde el redimiento se ve afectado porque no necesito la informacion de la tabla SairBriEstatus porque solo necesito la de SairBriAcciones, pero el atributo lazy="false" significa que siempre la va atraer.
Bueno eso fue lo que aprendí investigando y lo confirme con las pruebas.
Pero el problema viene en el otro proyecto.
Este el método de consulta que proporcione para que el otro proyecto(Cliente) lo consuma:
Cliente
Este proyecto consume el método consulta_acciones que proporcione del proyecto ServicioWeb.
También posee la clase prueba.
Este es el método para consumir el servicioweb:
Entonces realizando la misma prueba (en el Cliente):
Obtengo otra vez el error:
Pero si agrego el join fetch a la relación sige saltanto la excepción, para que no salte tengo que agregar el join fetch a todas las relaciones(son 2 relaciones "SairBriEstatus y SairBriBrief" que tiene la tabla SairBriAcciones) pero estaria haciendo lo mismo que el atributo lazy="false".
Lo que deseo es que solo traiga la información de la tabla SairBriAcciones, pero no lo consigo tengo usar todos los join fetch en todas las relaciones o utilizar el atributo lazy="false" para conseguirlo, pero el rendimiento de mi aplicación baja muchisimo.
Entonces deseo saber si alguien a pasado por este problema y como lo soluciono.
Repito deseo lo la información de la tabla SairBriAcciones en el Cliente sin activar la carga de las demás tablas.
DAO:
HibernateUtiles:
Saludos.