java - ejemplo - JSF2: ¿Abrir sesión a la vista con EJB?
jsf ejemplo (1)
¿Tiene sentido hablar del Open Session In View Pattern dentro de las aplicaciones JSF2? Mi aplicación tiene JSF2 Managed Beans llamando a Business Service EJBs que hacen todo lo relacionado con db (hay una capa DAO pero eso no importa ahora).
Tener un patrón OSIV significaría que Managed Bean tendría que asegurarse de alguna manera de que se abriera la sesión subyacente.
También estoy usando JPA.
Teóricamente, el problema es exactamente el mismo: la entidad se separará cuando abandone el EJB a menos que algo mantenga abierto el alcance del EntityManager. (Aquí hay una gran publicación sobre el tema en general: patrones de implementación de JPA: carga diferida ).
De una publicación de blog , leí:
8) Sin soporte de Open Entity Manager In View. [...] En EJB3, cuando su entidad abandona Bean con EntityManager con ámbito de transacción , se separa del contexto de persistencia y es posible que ya no dependa de la carga diferida (de hecho, la especificación JPA no especifica el comportamiento en dicha situación, probablemente algunos se lanzará una excepción dependiente del proveedor ...) Por supuesto, puede usar EntityManager con contexto de persistencia extendida , manteniendo el contexto de transacción y persistencia todo el tiempo que desee. Pero esta característica solo está disponible para SFSB, mientras que las clases DAO son ejemplos típicos de servicios sin estado, ya que solo envían llamadas a la capa de persistencia. Además, tener una instancia dedicada de bean DAO para cada cliente parece ser una gran exageración.
Sin embargo, no estoy seguro de que sea realmente cierto. Según tengo entendido, debe poder escribir un filtro de servlet que utilice UserTransaction
para iniciar y confirmar la transacción (como el filtro regular en OSIV). EJB luego participaría en la transacción iniciada en el filtro y el EntityManager
permanecería abierto. Aunque no lo probé, mi sugerencia sería intentarlo.