hibernar tema inicialización perezosa: LazyInitializationException: no se puede inicializar con pereza una colección de papel

StackOverflow https://stackoverflow.com/questions/781751

Pregunta

Quiero gestionar una transacción en mi capa de persistencia, Pero cuando trato de obtener los resultados con pereza me sale este error:

  

org.hibernate.LazyInitializationException: no se puede inicializar con pereza una colección de papel

¿Puedo utilizar LockMode o cualquier otra forma de resolver este problema? Se puede encontrar un un objeto por su id sin ningún tipo de transacción?

¿Fue útil?

Solución

Su problema es que la sesión de Hibernate ya está cerrado cuando intenta acceder al contenido. Hibernate no puede cargar el contenido sin una sesión. Por lo general hay dos maneras de mitigar este problema:

  1. No cierre la sesión hasta que haya terminado con la página. Este patrón se llama "sesión en vista" y puede por ejemplo ser implementada con un filtro de servlet.

  2. inicializar todos los contenidos que necesitará antes de cerrar la sesión. Si desea inicializar el objeto entero se puede utilizar Hibernate.initialize (objeto).

editar:. No se puede hacer nada fuera de una transacción en Hibernate

Otros consejos

También puede mirar a la solución oficial de hibernación en http://www.hibernate.org/43.html

Normalmente, el problema es que uno de los atributos del objeto se carga con pereza. Una cosa que puede hacer es tener que pre-cargado en su consulta:

Venta de venta donde sale.date>: startDate izquierda unirse a ir a buscar sale.product

Esto precargar el objeto sale.product.

este sitio tiene más información: http://www.javalobby.org/ artículos / hibernación-consulta-101 / .

-Dave

Hay muchas maneras de precargar propiedades, por lo que hay después de la sesión se cierra:

  1. Sólo tiene que llamar captador apropiado. Después de campo es inverosímil en frijol que hay después de la sesión se cierra.
  2. Uso atributo apropiado en el descriptor de frijol en la APP tendrá que utilizar @OneToMany(fetch = FetchType.EAGER), pero hay maneras de hibernación similares para hacerlo.
  3. Usted puede inicializar campo en consulta HQL (no estoy seguro si funciona en HQL, pero yo creo que sí), busque la palabra clave FETCH INTO.

O simplemente usar otro ORM ... como Ebean ORM, donde la carga diferida simplemente funciona:)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top