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