unitname que persistencecontext java java-ee jpa persistence entitymanager

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.