java - example - Estrategias para evitar Hibernate LazyInitializationExceptions
java persistence api (4)
¿Hay alguna otra forma de evitar LazyInitializationExceptions en una aplicación web Hibernate además de utilizar el patrón OpenSessionInView? ¿Hay algún inconveniente al usar OpenSessionInView?
Por lo general, es la mejor manera de manejar el problema, sin tomar una decisión global de hacer una búsqueda ansiosa; es usar la palabra clave "fetch" en conjunción con la consulta hql.
De http://www.hibernate.org/hib_docs/reference/en/html/queryhql-joins.html
Además, una unión "fetch" permite inicializar asociaciones o colecciones de valores junto con sus objetos principales, utilizando una única selección. Esto es particularmente útil en el caso de una colección. Con eficacia anula la combinación externa y las declaraciones vagas del archivo de asignación para asociaciones y colecciones. Consulte la Sección 19.1, "Estrategias de recuperación" para obtener más información.
de Cat como cat inner join fetch cat.mate left join fetch cat.kittens
Cambia a JBoss Seam.
El marco de Seam está bien diseñado por los chicos que desarrollaron Hibernate.
Incluso con la sesión abierta en la vista, es posible que todavía tenga algunos problemas. Según la complejidad de su aplicación web, Abrir sesión en vista no maneja todos los casos. También he tenido problemas para mostrar datos (en la interfaz de usuario) como buscar entidades durante un trabajo de cuarzo, como enviar un correo electrónico.
Hibernate ya obtiene de manera inteligente los datos, cambiar el modo de búsqueda provocará la degradación del rendimiento. No solo eso, sino que te estás alejando de las convenciones y arruinará tu proyecto con detalles de configuración extraños.
Walter
Al trabajar en nuestras aplicaciones web, generalmente decidimos de antemano qué objetos / campos se necesitarán en las páginas de vista y nos aseguramos de que todos los objetos se inicialicen correctamente desde el modelo antes de enviarlos a la vista.
Esto se puede lograr en (al menos) tres formas:
- obtener propiedades usando una estrategia ansiosa (es decir, con
FetchMode.JOIN
, si está utilizando la API de Criteria ) - propiedades de inicialización explícita (es decir, con
Hibernate.initialize(property)
) - inicialización implícita de propiedades llamando al acceso de propiedad apropiado
Acerca de las desventajas de OpenSessionInView, ¿has echado un vistazo a esta página?
Los tutoriales de Oracle Java señalan que "Enterprise beans admite transacciones, los mecanismos que administran el acceso concurrente de objetos compartidos". Entonces, para manejar los problemas de Lazy Fetch, creo un Bean de sesión Java Stateless y luego obtengo todas las subclases que necesito antes de regresar del método. Oracle también se ha referido a esto como un patrón central J2EE de "Fachada de Sesión". Estas prácticas parecen prácticas de aplicación mucho mejores que algunas de las otras mencionadas.