2008-10-18 5 views
7

¿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?Estrategias para evitar Hibernate LazyInitializationExceptions

+0

Hibernate 4.1.6 resuelve esto: http://stackoverflow.com/questions/578433/how-to-solve-lazy-initialization-exception-using-jpa-and-hibernate-as-provider/11913404#11913404 – andreak

Respuesta

8

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 inicializan correctamente desde el modelo antes de enviarlos a la vista.

Esto se puede lograr de (al menos) tres maneras:

  1. fetching propiedades utilizando la estrategia ansiosos (es decir, con FetchMode.JOIN, si usted está utilizando los Criteria API)
  2. propiedades de inicialización explícita (es decir, con Hibernate.initialize(property))
  3. implícitamente inicializar las propiedades para llamar a la propiedad de acceso apropiada

Acerca de las desventajas de OpenSessionInView, ¿has echado un vistazo a la página this?

5

Por lo general, la mejor manera de manejar el problema, sin tomar una decisión global para hacer una búsqueda emocionante; 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, un "fetch" join permite asociaciones o colecciones de valores que se inicializan junto con sus objetos padres, usando una sola 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 gato combinación interna traiga cat.mate dejó unirse a ir a buscar cat.kittens

1

Cambiar a JBoss Seam.

El marco 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 captar entidades durante un trabajo de cuarzo, como enviar un correo electrónico.

Hibernate ya obtiene de forma 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.

tutoriales Walter

0

El Oracle Java señalan que "los granos de la empresa de transacciones de apoyo, los mecanismos que gestionan 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.

Cuestiones relacionadas