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?
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.
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.
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.).
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