Tabla de Contenidos
Open Session In View
Este patrón está muy ligado a Hibernate y pretende solucionar el problema que genera la excepción lazyinitializationexception.
Ya explicamos en su momento que no es posible cargar objetos de forma lazy si la sesión ya la hemos cerrado. Como ya dijimos puede parecer extraño que nuestro código haga éso pero hay un caso muy típico donde realmente ocurre. A continuación pasamos a explicarlo:
Supongamos que tenemos un objeto DAO con todo el acceso a la base de datos mediante hibernate.El objeto DAO nos retornará un objeto de dominio, pero si dicho DAO abre y cierra la sesión, cuando accedamos a algún dato lazy del objeto de dominio la sesión ya estará cerrada.ENtonces se producirá la excepción org.hibernate.LazyInitializationException.
Una solución sencilla es que el objeto DAO ni cree ni cierre la sesión sino que se haga desde fuera.
El problema a esta solución es que en muchos frameworks se cierra la sesión justo antes de ejecutar el código de la presentación ,como en una app web que es cuando estamos en la página JSP. En la capa de presentación ya no deberíamos hacer accesos a la base de datos, aunque sea debido a la carga perezosa, así que se cierra la sesión antes de llegar a la página JSP.
¿Qué es entonces el patrón Open Session In View?
Pues con la explicación que acabamos de dar y el nombre del patrón ya debería estar claro. Es mantener abierta la sesión de Hibernate en la vista (en la página JSP). De esa forma podremos hacer cargas lazy en las páginas JSP evitando la excepción org.hibernate.LazyInitializationException.
Inconvenientes
Este patrón tiene ciertos inconvenientes lo que ha llevado a algunos a marcarlo como un antipatrón:
- Desde la capa de presentación se accede a la base de datos.
- En la capa de presentación se pueden producir excepciones de acceso a base de datos.
- Se pueden producir problemas de El problemas de las "n+1" SELECTs al no estar todo cargado.
Ventajas
Entonces, ¿qué ventajas nos ofrece el patrón Open Session In View?
El problema se produce principalmente con las cargas lazy. Si las evitamos no necesitamos este patrón. Pero a cambio deberemos tener siempre en cuenta qué datos necesita la presentación y cargarlos previamente. Éso nos lleva a una capa de negocio más dependiente de la capa de presentación y más compleja al tener que cargar los datos en función de la presentación a utilizar. Además de que perdemos las ventajas de las cargas lazy en caso de que no se usen los datos.
¿Debemos entonces usar el patrón Open Session In View? Pues como todo en esta vida tiene sus ventajas en inconvenientes y ya depende de nosotros evaluar en cada caso si merece la pena usarlo.