En muchas ocasiones me he encontrado con personas que tienen la siguiente duda .¿Son EntityManager y EntityManagerFactory Singleton?. O mejor aún aunque no sean Singleton ¿Se pueden tratar como si lo fueran? . Vamos a verlo un poco mas a detalle.
No son Singletons
Ninguna de estas dos clases son objetos de tipo Singleton . El EntityManagerFactory es la clase que se encarga de abrir la conexión a la base de datos y pone a nuestra disposición los distintos EntityManager que usemos .
Después de ver este diagrama esta muy claro que los EntityManager no son clases Singleton ya que puede existir muchas intancias de ellas generadas a través del EntityManagerFactory. Un EntityManager esta ligado habitualmente aunque no siempre (Extended EntityManagers) a una transacción y tiene de vida lo que dura esa transacción.
EntityManagerFactory
Estos objetos son con los que mas dudas aparecen ya que se cargan una vez y se pueden configurar como si fueran Singletons pero realmente no lo son ya que podemos tener un EntityManagerFactory por cada unidad de persistencia que tengamos a nivel de persistence.xml . Cada una de estas unidades estará asociada a una base de datos concreta.
Por lo tanto hay que estar atento a como configuramos estos elementos ya que los EntityManagers no deben tratarse como Singletons nunca. Mientras que los EntityManagerFactories depende mucho de la casuistica de la aplicación.
Otros artículos relacionados
Arquitecturajava : Ejemplo de JPA
ArquitecturaJava : Ejemplo de uso EntityManager
Arquitectura Java :EntityManager Métodos
Hol Cecilio, excelente post. tengo unas dudas en una aplicación web (sin ejbs) y con jpa 2.1. mi duda apunta a como y cuando crear el EntityManagerFactory y el EntityManager. me explico un poco mas. por lo que entiendo cada vez que hago una solicitud al backend, en este caso en mi servlet, creo un EMF y un EM y accedo a la base de datos y que una vez realizada la operación debería cerrar el EMF y EM para volverlos a crear en una siguiente solicitud. Esto esta bien o estoy entendiendo mal? Además intente usar el EntityManager como… Read more »
En principio un entity manager esta ligado a gestionar un ciclo de vida corto ligado a un thread que ejecuta una peticion http . Así que en principio parece correcto. El entityManagerFactory es otra historia ya que es el que crea los EntityManager
Buenas tardes Cecilio.
Muy interesante tú post. Tengo una necesidad particular en una aplicación que estoy desarrollando. Cómo bien lo mencionas arriba por cada unidad de persistencia que tengo en el archivo persistence.xml puedo tener un EntityManagerFactory, sin embargo cuando tengo una aplicación que podría conectarse a múltiples bases de datos y no quiero ligar la definición al persistence.xml que alternativas de implementación podría tener?. Se puede pensar este escenario como una creación dinámica de objetos EntityManagerFactory desde el código de mi aplicación sin la necesidad de tocar el persistence.xml.
Agradezco tú respuesta.
[…] artículos relacionados: El concepto de EntityManager , JPA Introducción , Introducción a […]
[…] Otros artículos relacionados: Flexibilidad en JPA ,EntityManager y Singletons ,EntityManagerEstados […]
Cada unidad de persistencia puede usar un ORM distinto ?
No eso no creo. Todo estará bajo la misma implementación. Ademas no tendría mucho sentido usar JPA como standard y luego una parte hacerla con Toplink y otra con Hibernate. Otra cosa es que tuvieramos temas como JDBC o MyBatis
Hola Cecilio, Estoy trabajando una aplicacion en wildfly + Ejb + hibernate 4.3 no se como hacer para inicializar las entidades relacionadas, con hibernate 3.6 existia Hibernate.initialize(entidad) pero en 4.3 no tengo idea como hacerlo me podrias ayudar? Saludos.
No te se decir pero con jpa es suficiente q estén en el persistente xml
Cecilio:
excelente Explicación!!… lo mismo puede extenderse al trabajo de otras Fábricas que nos proveen algunos framework tales como las de MyBatis (SqlSessionFactory) y Spring (BeanFactory).
gracias 🙂
Hola Cecilio, en la siguiente parte:
“EntityManager no son clases Singleton ya que puede existir muchas intancias de ellas generadas a través del EntityManager”
no sería “…generadas a través del EntityManagerFactory” ¿?
Salu2!!!
gracias 🙂 Corregido