PersistenceUnit vs PersistenceContext


En pocos proyectos he estado usando

@PersistenceUnit(unitName = "MiddlewareJPA")
EntityManagerFactory emf;
...
EntityManager entityManager = emf.createEntityManager();

Para obtener EntityManager para la conexión a la base de datos, pero hace unos días estaba tratando de mover mi proyecto a Jboss EAP 6.2 y no pudo crear EntityManager. Lo estaba buscando en Google y descubrí que debería intentar cambiar @PersistenceUnit a

@PersistenceContext(unitName = "MiddlewareJPA")
private EntityManager entityManager;

Para obtener EntityManager. Funcionó, pero no se 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 usar uno de ellos?

Author: informatik01, 2014-01-10

3 answers

No se como funciona exactamente en Java EE, pero en primavera, cuando se especifica @PersistenceContext anotación, se inyecta EntityManager. ¿De dónde sale EntityManager? Es incorrecto crear una EntityManager para toda la vida de la aplicación llamando a EntityManagerFactory.createEntityManager(). Así que en su lugar se usa una implementación especial de la interfaz EntityManager y se instancian directamente. Tiene una referencia local mutable interna a un real EntityManager. Las implementaciones de métodos solo redirigen las llamadas a este real EntityManager. Y hay un servlet listener, que antes de cada petición obtiene EM llamando EMF.createEntityManager() y lo asigna a esa referencia interna de especial EM. También este oyente administra las transacciones llamando getTransaction().begin(), .commit() y .rollback()en el real EM. Es una descripción muy simplificada del trabajo realizado. Y creo que ese JEE container hace lo mismo que Spring.

En general, es mejor inyectar EntityManager, porque con EntityManagerFactory y @PersistenceUnit debe crear / destruir EntityManager cada vez por manos y administrar transacciones también.

 35
Author: Alexey Andreev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-10 10:19:05

PersistenceUnit inyecta un EntityManagerFactory, y PersistenceContext inyecta un EntityManager. Generalmente es mejor usar PersistenceContext a menos que realmente necesite administrar el ciclo de vida EntityManager manualmente.

 51
Author: chrylis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-10 07:50:42

EntityManager obtenido a través de @PersistenceContext se llama Container Managed EntityManager ya que container será responsable de administrar "EntityManager". EntityManager obtenido a través de @PersistenceUnit / EntityManagerFactory.createEntityManager () es administrado en la aplicación por el desarrollador. (por ejemplo, administrar el ciclo de vida de EntityManager, liberar los recursos adquiridos por EntityManager, etc.).

 7
Author: Raj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-28 17:05:23