2014-01-10 9 views
32

In wenige Projekt, das ich erfolgreich wurde mitPersistenceUnit vs PersistenceContext

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

EntityManager für Datenbankverbindung zu erhalten, aber vor einigen Tagen versuche ich mein Projekt Jboss EAP 6.2 zu bewegen, und es kann nicht EntityManager erstellen. Ich war es googeln und ich fand, dass ich versuche, @PersistenceUnit zu

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

EntityManager erhalten ändern sollte. Es hat funktioniert, aber ich weiß nicht warum. Was ist der Unterschied zwischen PersistenceUnit und PersistenceContext? Was sind Vor- und Nachteile von jedem? Wo sollen wir einen davon benutzen?

+0

Erwägen Sie, die CDI-Spezifikation (neu in JEE 6) zu übernehmen, um Ihre Abhängigkeitsinjektionen durchzuführen, sodass Sie eine "universellere" Vorgehensweise anstelle eines großen Stapels von API-/Framework-spezifischen Anmerkungen haben. Das bietet keine Unterstützung für Entity Manager-Injektionen in JEE 6 selbst, aber es gibt dokumentierte Möglichkeiten, damit umzugehen. http://www.mastertheboss.com/cdi/cdi-and-jpa-tutorial – Gimby

+1

Als Ergänzung zu den verfügbaren Antworten: Hier ist ein sehr nützlicher Artikel, der auch helfen kann, die Fragen des OP zu beantworten: [JPA Konzepte] (http: //tomee.apache.org/jpa-concepts.html) – informatik01

Antwort

31

Ich weiß nicht, wie es genau in der Java EE funktioniert, aber im Frühjahr, wenn Sie @PersistenceContext Annotation angeben, injiziert es EntityManager. Woher bekommt es EntityManager? Es ist falsch, einen EntityManager für die gesamte Lebensdauer der Anwendung durch Aufruf EntityManagerFactory.createEntityManager() zu erstellen. Stattdessen wird eine spezielle Implementierung der Schnittstelle EntityManager verwendet und direkt instanziiert. Es hat eine interne veränderbare Thread-lokale Referenz auf eine echteEntityManager. Implementierungen von Methoden umleiten nur Aufrufe an diese realEntityManager. Und es gibt einen Servlet-Listener, der vor jeder Anforderung EM durch Aufruf von EMF.createEntityManager() erhält und dieser internen Referenz von Spezial EM zuweist. Auch dieser Listener verwaltet Transaktionen durch Aufrufen von getTransaction().begin(), .commit() und .rollback() über die realEM. Es ist eine sehr vereinfachte Beschreibung der durchgeführten Arbeit. Und ich glaube, dass JEE-Container das gleiche tut, wie Spring es tut.

Im allgemeinen Fall ist es besser EntityManager zu injizieren, weil mit EntityManagerFactory und @PersistenceUnit sollten Sie erstellen/EntityManager durch die Hände jedes Mal zerstören und Transaktionen zu verwalten.

42

PersistenceUnit injiziert eine EntityManagerFactory und PersistenceContext injiziert eine EntityManager. Im Allgemeinen ist es besser, PersistenceContext zu verwenden, es sei denn, Sie müssen den Lebenszyklus EntityManager manuell verwalten.

+0

Schön und einfach! – webDeveloper

6

EntityManagers erhalten über @PersistenceContext sind Container Entity Managed-Manager als Container zuständig sein wird "Entity verwalten", während EntityManagers erhalten über @PersistenceUnit/entityManagerFactory.createEntityManager für die Verwaltung() sind Application Entity Managed-Manager und der Entwickler muss bestimmte Dinge im Code verwalten (zB um die von EntityManager erworbenen Ressourcen freizugeben).