Dado: aplicación web JSF simple (sin costura), que tiene beans JSF llamando a algunos EJB que a su vez cargan y persisten las entidades JPA. Lo que quiero es utilizar @Singleton
anotación para EJB e inyectar EntityManager
en lugar deEntityManagerFactory
:EJB 3.1 Se necesita asesoramiento de diseño Singleton + JPA + JSF
@Singleton
public class MyEJB {
@PersistenceContext(unitName = PERSISTENCE_UNIT_NAME)
protected EntityManager em; // not EntityManagerFactory
}
Spec dice que @Singleton
es seguro para subprocesos, apoya la concurrencia y los atributos de transacción de la que (desde mi pov) hace que sea seguro para llamar desde beans JSF. También espero beneficios de rendimiento porque EntityManager
no se recrean para cada llamada y son capacidades internas de almacenamiento en caché.
Mi principal preocupación aquí es crear operaciones/actualización de entidades JPA en la situación cuando tengo varios hijos únicos y, como resultado, el mismo número de EntityManagers de larga vida.
- ¿Qué pasa si uno Singleton actualiza una instancia de la APP y cómo estos cambios están pobladas a otros conjuntos unitarios?
- Como no puedo cerrar el administrador de entidades, ¿tengo que vaciarlo al cada actualización de entidad?
- ¿Sería mejor si estos pocos singleton compartirían el mismo administrador de entidad ?
- Vi solo algunos ejemplos de dicho diseño. ¿Por qué? ¿Hay algún problema grave con ?
¡Muchas gracias de antemano!
Esta respuesta es buena, pero podría aclarar la confusión si mencionó que el EM inyectado es en realidad un proxy de un EM por transacción. Ver http://stackoverflow.com/questions/7010470/ejb-3-1-transaction-entitymanager/7017915#7017915 –
@bkail, Behrang gracias por su respuesta y comentario. – Osw
@Osw: de nada. :) – Behrang