java - que - @persistencecontext unitname
PersistenceUnit vs PersistenceContext (3)
En pocos proyectos he estado usando con éxito
@PersistenceUnit(unitName = "MiddlewareJPA")
EntityManagerFactory emf;
...
EntityManager entityManager = emf.createEntityManager();
para obtener EntityManager
para la conexión a la base de datos, pero hace algunos días estaba intentando mover mi proyecto a Jboss EAP 6.2
y no pudo crear EntityManager
. Estaba buscando en Google y descubrí que debería intentar cambiar @PersistenceUnit
para
@PersistenceContext(unitName = "MiddlewareJPA")
private EntityManager entityManager;
para obtener EntityManager . Funcionó, pero no sé por qué. ¿Cuál es la diferencia entre PersistenceUnit
y PersistenceContext
? ¿Cuáles son los pros y los contras de cada uno? ¿Dónde deberíamos estar usando uno de ellos?
Los gestores de entidades que se obtienen a través de @PersistenceContext son el administrador de la entidad administrada por el contenedor, ya que los gestores de Entity Managers administran "Entity Manage" mientras que EntityManagers los obtiene mediante @PersistenceUnit / entityManagerFactory.createEntityManager () y el desarrollador tiene que administrar ciertas cosas en el código (por ejemplo liberando los recursos adquiridos por EntityManager).
No sé cómo funciona exactamente en Java EE, pero en Spring, cuando se especifica la anotación @PersistenceContext
, se inyecta EntityManager
. ¿De dónde obtiene EntityManager
? Es incorrecto crear un EntityManager
para toda la duración de la aplicación llamando a EntityManagerFactory.createEntityManager()
. Por lo tanto, en su lugar, se utiliza una implementación especial de la interfaz EntityManager
se EntityManager
instancia directamente. Tiene una referencia interna local de subprocesos mutables a un EntityManager
real . Las implementaciones de métodos solo redirigen las llamadas a este EntityManager
real . Y hay un oyente servlet, que antes de cada solicitud obtiene EM
llamando a EMF.createEntityManager()
y lo asigna a esa referencia interna de EM
especial. También este oyente maneja las transacciones llamando a getTransaction().begin()
.commit()
, .commit()
y .rollback()
en el EM
real . Es una descripción muy simplificada del trabajo realizado. Y creo que ese contenedor JEE hace lo mismo, como Spring.
En general, es mejor inyectar EntityManager
, ya que con EntityManagerFactory
y @PersistenceUnit
debe crear / destruir EntityManager
cada vez con las manos y administrar las transacciones también.
PersistenceUnit
inyecta EntityManagerFactory
y PersistenceContext
inyecta un EntityManager
. En general, es mejor usar PersistenceContext
menos que realmente necesite administrar el ciclo de vida de EntityManager
manualmente.