open session in view

Hola, quiero implementar este patron de diseño usando exclusivamente JSF. Alguien que sepa algo o que tengo algun link de referencia?

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

Exclusivamente JSF?

Siquiera sabes qué significa o qué es el patrón open session in view?

En Hibernate, necesitas tener una sesión de Hibernate abierta para poder leer objetos, actualizarlos, crearlos, borrarlos, etc (interacción con la base de datos). El patrón open session in view significa que cuando se está generando una vista (un render de una página por ejemplo), se tenga una sesión abierta, para que cualquier interacción con Hibernate ocurra sin problemas. Y al final del render se tiene que cerrar la sesión. Cada vista que se esté generando necesita tener su propia sesión.

Eso significa el open session in view. La mejor manera de lograrlo es con algun plugin, que se use por medio de anotaciones o algo para no tener que meter código específico de Hibernate en la vista, pero cause que se abra una sesión de Hibernate al generar la vista y que se cierre terminando, sin importar si hubo excepción o si todo salió bien. Así cualquier DAO que se invoca desde la vista, puede hacer su trabajo teniendo una sesión abierta.

Hi! Ezamudio

Si aplique ese patron cuando estaba aprendiendo Hibernate por si solo. En mis servlets cuando se realizaba una peticion por parte del usuario en metodo init mandaba a llamar mi metodo openSession(), en el doPost() realizaba todas mis transacciones y en el metodos Detroy() mandaba a llamar mi metodo closeSession(), asi aseguraba que se mantuviera abierta mi session y mi conexion a la base de datos hasta que terminara el request. Pero con JSF ya no uso servlets y aunque me las podria ingeniar para que trabajara de la misma manera, queria saber si existia alguna forma estandar de realizar esta operacion usando solamente JSF.

Imagen de benek

Con MyFaces

Yo he visto que lo implementan con MyFaces, pero no sé de una integración con JSF puro...

Espero que esto te pueda servir: http://www.jroller.com/HazemBlog/entry/implementing_hibernate_open_sessi...

--
Javier Benek
http://twitter.com/xbenek
http://www.javamexico.org/tema/lineamientos_de_publicacion

Imagen de benek

Patrón de Diseño.

También recuerda que los "Patrones de Diseño" son como "best practices" conceptualizados y estandarizados, si estudias lo suficiente el concepto y la idea del patrón quizá encuentres "tu" manera de implementarlo y la puedas llevar a cabo (es así como nacen muchos frameworks).

Ahora, Hibernate ya te da un avance para que utilices el patrón sin tener que hacerlo desde cero. Encontré en la documentación un apartado completamente dedicado a Open Session in View, te da un panorama de como aplicarlo sin meterte en líos con Spring, JSF, MyFaces, etc... es decir es la base que perfectamente podrás aplicar desde cualquier webapp ;-)

Está por acá: https://www.hibernate.org/43.html

--
Javier Benek
http://twitter.com/xbenek
http://www.javamexico.org/tema/lineamientos_de_publicacion

JSF y Hibernate sin Spring

Que tal Javadicto, como te comentan los patrones de diseño son la solución a tu problema si no quieres usar Spring en tu aplicación . Con un par de patrones de diseño arreglas tu problema, te recomendaría es hacer lo siguiente:

* No manejes la sesion de Hibernate en la presentación, no tiene sentido y no es necesario. En tu capa de presentación lo que requieres son datos, sin importar de donde provienen estos (Mysql, Oracle o LDAP, un WebService, un EJB's, etc) ya que a la presentación no le interesa saber esto. Si lo haces estas provocando que Hibernate sea intrusivo en tu aplicacion y una de las finalidades de Hibernate es el no ser un framework Intrusivo.

* Te recomiendo manejar otra capa intermedia que muchos conocen con diferentes nombres (Bussines Delegate, Services, Facade, etc) para que en esta capa hagas el manejo de la Session de Hibernate y manejes de manera atomica cada peticion a esta capa Cerrando la sesion siempre, ya que si no cierras la sesion en Hibernate vas a provocar conexiones abiertas y esto puede ser muy peligroso, cosa que con Spring te ahorrarias.

* El antiguo patrón de la banda de los 4 (GOF) el "Singleton" puedes aplicarlo a tus Services y a tus DAO's o bien puedes crear un Factory te ayudara mucho sobre todo para la parte de hacer uso de Interfaces, aqui nuevamente Spring te facilita la vida haciendo que sea muy fácil programar orientado a Interfaces.

* Finalmente en tus Managed Beans invocas a tus services, puedes obtener la instancia de los mismos en el contructor, por ejemplo:

  public class MiBean {
     
      public MiBean(){
            MiService service = MiService.getInstance();
      }

      public List<Empresas> listaEmpresas(){
                 return service.obtieneEmpresas();

     }

   ......

 }

Como bien dice Javier y Ezamudio, no estaria mal que le des una repasada a los patrones de diseño y entender el objetivo de cada uno, asi como donde es mejor no usarlos.

http://es.wikipedia.org/wiki/Patr%C3%B3n_de_dise%C3%B1o
http://es.wikipedia.org/wiki/Grasp

Saludos