Herramientas de usuario

Herramientas del sitio


patrones:osiv
no way to compare when less than two revisions

Diferencias

Muestra las diferencias entre dos versiones de la página.


patrones:osiv [2023/04/07 21:26] (actual) – creado - editor externo 127.0.0.1
Línea 1: Línea 1:
 +====== Open Session In View ======
 +Este patrón está muy ligado a Hibernate y pretende solucionar el problema que genera la excepción [[unidades:06_objetos_validaciones:01_trabajando_objetos&#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 [[patrones: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 <javadoc h41>org.hibernate.LazyInitializationException</javadoc>.
 +
 +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 <javadoc h41>org.hibernate.LazyInitializationException</javadoc>.
 +
 +===== 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 [[unidades:05_hibernate_query_language:05_optimizacion#el_problemas_de_las_n_1_selects|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.
 +
 +===== Referencias =====
 +  * [[https://community.jboss.org/wiki/OpenSessionInView]]
 +  * [[http://forum.springsource.org/showthread.php?24174-Avoiding-OpenSessionInView]]
 +  * <javadoc s31>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</javadoc>
 +  * [[http://java.dzone.com/articles/opensessioninview-antipattern|The OpenSessionInView Antipattern]] o [[http://blog.frankel.ch/the-opensessioninview-antipattern|The OpenSessionInView Antipattern]]
patrones/osiv.txt · Última modificación: 2023/04/07 21:26 por 127.0.0.1