Die EntityManager-Schnittstelle ist eine API, die den Lebenszyklus einer Entitäteninstanz verwaltet.
Entitäten können sich in der relationalen Datenbank nicht selbst als persistent definieren. Annotationen werden lediglich dazu verwendet, ein POJO als Entität zu deklarieren oder seine Zuordnung und Beziehungen zu den entsprechenden Tabellen in der relationalen Datenbank zu definieren.
In JPA wird die EntityManager-Schnittstelle dazu verwendet, Anwendungen die Verwaltung von und Suche nach Entitäten in der relationalen Datenbank zu ermöglichen.
EntityManager ist eine API, die den Lebenszyklus von Entitäteninstanzen verwaltet. Ein EntityManager-Objekt verwaltet einen Satz von Entitäten, die von einer Persistenzeinheit definiert werden. Jede EntityManager-Instanz wird einem Persistenzkontext zugeordnet. Ein Persistenzkontext definiert den Bereich, in dem bestimmte Entitäteninstanzen über die APIs, die EntityManager bereitstellt, erstellt, als persistent definiert und entfernt werden. Ein Persistenzkontext ist vom Konzept her gesehen teilweise einem Transaktionskontext ähnlich.
Der Entitätsmanager (Entity Manager) überwacht alle Entitätsobjekte innerhalb eines Persistenzkontexts hinsichtlich Änderungen und Aktualisierungen und schreibt diese Änderungen in die Datenbank. Sobald ein Persistenzkontext geschlossen wird, wird die Zuordnung sämtlicher verwalteter Entitätsobjektinstanzen zum Persistenzkontext und dem zugeordneten Entitätsmanager aufgehoben und sie werden nicht länger verwaltet. Sobald die Zuordnung eines Objekts zu einem Persistenzkontext aufgehoben ist, kann eine Verwaltung durch einen Entitätsmanager nicht mehr stattfinden und sämtliche Zustandsänderungen an dieser Objektinstanz werden nicht mit der Datenbank synchronisiert.
Eine Entitätsobjektinstanz wird entweder durch einen Entitätsmanager verwaltet (ist zugeordnet) oder nicht verwaltet (ist nicht mehr zugeordnet).
Wenn eine Entität einem Entitätsmanager zugeordnet ist, überwacht der Manager sämtliche Änderungen an der Entität und synchronisiert sie mit der Datenbank, sobald der Entitätsmanager entscheidet, den Zustand zur Synchronisation in der Datenbank zu erzwingen.
Ist die Zuordnung einer Entität aufgehoben und ist daher keine Zuordnung zu einem Persistenzkontext mehr gegeben, wird sie nicht mehr verwaltet und ihre Zustandsänderungen werden vom Entitätsmanager nicht verfolgt.
Die Verwaltung und die Zuordnung von Entitäteninstanzen werden aufgehoben, wenn ein Transaktionsbereich oder ein erweiterter Persistenzkontext beendet wird. Eine wichtige Konsequenz dieser Tatsache ist, dass Entitäten, deren Zuordnung aufgehoben wurde, serialisiert und über das Netz an einen fernen Client gesendet werden können. Der Client kann an diesen serialisierten Objektinstanzen per Fernzugriff Änderungen vornehmen und sie wieder an den Server senden, damit sie wieder in der Datenbank zusammengeführt und mit der Datenbank synchronisiert werden.
Operation | Beschreibung |
---|---|
persist |
|
find | Abrufen einer verwalteten Entitäteninstanz mit einer angegebenen persistenten Identität (Primärschlüssel). Wird keine Entitäteninstanz gefunden, wird der Wert null zurückgegeben. |
remove | Löschen einer verwalteten Entität mit der angegebenen persistenten Identität aus der Datenbank. |
merge | Zustand einer Entität mit aufgehobener Zuordnung wird mit einer verwalteten Kopie der Entität mit aufgehobener Zuordnung zusammengeführt. Die verwaltete Entität, die zurückgegeben wird, weist eine andere Java-Identität auf als die Entität mit aufgehobener Zuordnung. |
refresh | Erneutes Laden des Entitätszustands aus der Datenbank. |
lock | Festlegen des Sperrmodus für ein Entitätsobjekt, das im Persistenzkontext enthalten ist. |
flush | Erzwingen der Synchronisation mit der Datenbank. |
contains | Feststellen, ob eine Entität im aktuellen Persistenzkontext enthalten ist. |
createQuery | Erstellen einer Abfrageinstanz mit dynamischer Java Persistent Query Language. |
createNamedQuery | Erstellen einer Instanz einer vordefinierten Abfrage. |
createNativeQuery | Erstellen einer Instanz einer SQL-Abfrage. |
Eine Möglichkeit, einen Entitätsmanager in einer Java EE-Umgebung zu verwenden, besteht in der Verwendung eines containergesteuerten Entitätsmanagers. In diesem Modus ist der Container für das Öffnen und Schließen des Entitätsmanagers zuständig und somit auch für den Lebenszyklus des Persistenzkontexts (in einer Art und Weise, die für die Anwendung transparent ist). Ein containergesteuerter Entitätsmanager ist auch für Transaktionsgrenzwerte zuständig.
Ein containergesteuerter Entitätsmanager kann in einer Anwendung durch eine Abhängigkeitsinjektion oder eine JNDI-Suche abgerufen werden. Der Container verwaltet Interaktionen zwischen der Entitätsmanagerfactory und der Anwendung transparent.
Für einen containergesteuerten Entitätsmanager muss eine JTA-Transaktion verwendet werden, weil der zugehörige Persistenzkontext mit der aktuellen JTA-Transaktion automatisch weitergegeben wird und die Entitätsmanagerreferenzen, die derselben Persistenzeinheit zugeordnet sind, Zugriff auf diesen Persistenzkontext innerhalb der JTA-Transaktion bieten. Diese Weitergabe des Persistenzkontexts durch den Java EE-Container bedeutet, dass die Anwendung keine Referenzen an die Entitätsmanagerinstanzen zwischen zwei Komponenten übergeben muss.
Mit einem anwendungsgesteuerten Entitätsmanager können Sie den Entitätsmanager im Anwendungscode steuern.