PersistenceUnit vs PersistenceContext

W kilku projektach z powodzeniem używam

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

Aby uzyskać {[2] } do połączenia z Bazą Danych, ale kilka dni temu próbowałem przenieść mój projekt do Jboss EAP 6.2 i nie mógł utworzyć EntityManager. Szukałam go w googlach i stwierdziłam, że powinnam spróbować zmienić @PersistenceUnit na

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

Aby uzyskać EntityManager. Zadziałało, ale nie wiem dlaczego. Jaka jest różnica pomiędzy PersistenceUnit i PersistenceContext? Jakie są plusy i minusy każdego z nich? Gdzie powinniśmy użyć jednego z nich?

Author: informatik01, 2014-01-10

3 answers

Nie wiem jak to dokładnie działa w Javie EE, ale na wiosnę, gdy podasz @PersistenceContext adnotację, wstrzykuje EntityManager. Skąd to się bierze EntityManager? Błędem jest tworzenie EntityManager przez cały okres życia aplikacji przez wywołanie EntityManagerFactory.createEntityManager(). Zamiast tego używana jest specjalna implementacja interfejsu EntityManager, która tworzy instancję bezpośrednio. Ma wewnętrzny zmienny wątek-lokalne odniesienie do prawdziwego EntityManager. Implementacje metod po prostu przekierowują wywołania do tego rzeczywistego EntityManager. I jest Servlet listener, że przed każdym żądaniem uzyskać EM przez wywołanie EMF.createEntityManager() i przypisać go do tego wewnętrznego odniesienia specjalnego EM. Również ten słuchacz zarządza transakcjami poprzez wywołanie getTransaction().begin(), .commit() and .rollback() on the real EM. Jest to bardzo uproszczony opis wykonywanej pracy. I wierzę, że pojemnik JEE robi to samo, co Spring.

W ogólnym przypadku lepiej jest wstrzykiwać EntityManager, ponieważ z EntityManagerFactory i @PersistenceUnit należy tworzyć / niszczyć EntityManager za każdym razem przez ręce i zarządzać transakcjami też.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-10 10:19:05

PersistenceUnit wstrzykuje EntityManagerFactory, A PersistenceContext wstrzykuje EntityManager. Ogólnie lepiej jest używać PersistenceContext, chyba że naprawdę trzeba ręcznie zarządzać cyklem życia EntityManager.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-10 07:50:42

EntityManager uzyskany przez @PersistenceContext nazywa się Container Managed EntityManager ponieważ kontener będzie odpowiedzialny za zarządzanie "EntityManager ". EntityManager uzyskany przez @PersistenceUnit / entityManagerFactory.createEntityManager () jest zarządzany w aplikacji przez dewelopera. (np. do zarządzania cyklem życia EntityManager , uwalniania zasobów nabytych przez EntityManager itp.).

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-28 17:05:23