Java Persistence API (JPA)
Datenpersistenz ist ein Mittel, mit dem eine Anwendung Informationen in einem nicht flüchtigen Speichersystem persistent speichern und aus diesem abrufen kann. Die Java™ Persistence API (JPA) bietet einen Mechanismus zur Verwaltung von Persistenz und objektrelationalem Mapping und ist seit den EJB- 3.0 -Spezifikationen im Einsatz.
Informationen zur Verwendung von JPA 2.1 und höher mit Liberty finden Sie auf der Website „ Open Liberty “.
Die Persistenz ist für Unternehmensanwendungen aufgrund des erforderlichen Zugriffs auf relationale Datenbanken von essenzieller Bedeutung. Anwendungen, die für diese Umgebung entwickelt wurden, müssen die Persistenz selbst steuern oder Lösungen anderer Anbieter verwenden, um Datenbankaktualisierungen und Datenbankabrufe mit Persistenz auszuführen.
Die Spezifikation JPA definiert die objektbezogene Zuordnung intern und setzt keine herstellerspezifischen Implementierungen voraus. JPA basiert auf dem Java-Programmiermodell, das für Java-Enterprise Edition -Umgebungen ( Java EE ) gilt, kann jedoch auch in einer Java-SE-Umgebung zum Testen von Anwendungsfunktionen eingesetzt werden.
JPA stellt eine Vereinfachung des Persistenzprogrammiermodells dar. Die Spezifikation JPA definiert die objektbezogene Zuordnung explizit und setzt keine herstellerspezifischen Zuordnungsimplementierungen voraus. JPA standardisiert die wichtige Aufgabe der objektbezogenen Zuordnung durch Verwendung von Annotationen oder XML, um Objekte in einer oder mehreren Tabellen einer Datenbank zuzuordnen. Zur weiteren Vereinfachung des Persistenzprogrammiermodells stellt JPA Folgendes bereit:
- Die EntityManager-API kann Objekte persistent in einer Datenbank speichern, aktualisieren, abrufen und entfernen.
- Die EntityManager-API und die Metadaten für die objektrelationale Zuordnung verarbeiten die meisten Datenbankoperationen, ohne dass Sie JDBC- oder SQL-Code für die Verwaltung der Persistenz schreiben müssen.
- JPA stellt eine Abfragesprache bereit, die die unabhängige EJB-Abfragesprache (auch als JPQL bekannt) erweitert und mit der Sie Objekte abrufen können, ohne spezielle SQL-Abfragen für die Datenbank schreiben zu müssen, mit der Sie arbeiten.
JPA ist so konzipiert, dass es sowohl innerhalb als auch außerhalb eines Java- Enterprise Edition -Containers ( Java EE) betrieben werden kann. Wenn Sie JPA innerhalb eines Containers ausführen, können die Anwendungen den Container zur Verwaltung des Persistenzkontextes verwenden. Falls kein Container für die JPA-Verwaltung existiert, muss die Anwendung die Verwaltung des Persistenzkontextes selbst ausführen. Anwendungen, die für die containergesteuerte Persistenz vorgesehen sind, benötigen weniger Codeimplementierungen zur Persistenzverwaltung, aber sie können nicht außerhalb eines Containers verwendet werden. Anwendungen, die ihre Persistenz eigenständig verwalten, können in einer Containerumgebung und in einer Java SE-Umgebung eingesetzt werden.
Java EE-Container, die das EJB 3.x-Programmiermodell unterstützen, müssen eine JPA-Implementierung, die auch als Persistenzprovider bezeichnet wird, unterstützen. Ein JPA-Persistenzprovider verwendet die folgenden Elemente, um die Persistenzverwaltung in einer EJB 3.x-Umgebung zu vereinfachen.
- Persistenzeinheit
- Definiert ein vollständiges objektrelationales Modell, das Java-Klassen (Entitäten + unterstützende Strukturen) einer relationalen Datenbank zuordnet. Die "EntityManagerFactory" verwendet diese Daten, um einen Persistenzkontext zu erstellen, der über den "EntityManager" zugänglich ist.
- EntityManagerFactory
- Wird verwendet, um einen "EntityManager" für Datenbankinteraktionen zu erstellen. Diese Funktion wird normalerweise von den Anwendungsservercontainern bereitgestellt. Wenn Sie jedoch die anwendungsverwaltete JPA-Persistenz verwenden, ist die EntityManagerFactory erforderlich. Eine EntityManagerFactory-Instanz stellt einen Persistenzkontext dar.
- Persistenzkontext
- Definiert die Gruppe aktiver Instanzen, die die Anwendung derzeit bearbeitet. Sie können den Persistenzkontext manuell oder durch Injektion erstellen.
- EntityManager
- Der Ressourcenmanager, der die aktive Sammlung der Entitätsobjekte verwaltet, die von der Anwendung verwendet werden. Der "EntityManager" steuert die Datenbankinteraktion und die Metadaten für objektbezogene Zuordnungen. Eine EntityManager-Instanz stellt einen Persistenzkontext dar. Eine Anwendung in einem Container kann den "EntityManager" durch Injektion in die Anwendung oder durch eine Suchoperation im Namespace der Java-Komponente erhalten. Wenn die Anwendung ihre Persistenz verwaltet, erhält sie den "EntityManager" aus der "EntityManagerFactory".
- Entitätsobjekte
- Eine einfache Java-Klasse, die eine Zeile in einer Datenbanktabelle in ihrer einfachsten Form darstellt. Entitätsobjekte können konkrete Klassen oder abstrakte Klassen sein. Sie verwalten Statusinformationen über Eigenschaften oder Felder.
JPA- (Java Persistence API) und lokale Transaktionskontexte
WebSphere stellt globale und lokale Transaktionskontexte für verwaltete Komponenten bereit. Durch die Bereitstellung dieser Kontexte für verwaltete Komponenten und durch Threads zur Bedienung verwalteter Komponenten ist eine Transaktion immer aktiv, unabhängig davon, ob es sich um einen globalen Transaktionskontext oder einen lokalen Transaktionskontext handelt.
Diese Verarbeitung wirkt sich nicht auf anwendungsgesteuerte Persistenzkontexte aus, d. h., JPA-EntityManagers, die EntityManagerFactories angefordert und mit @PersistenceUnit in eine Anwendung eingefügt wurden. Diese Verarbeitung kann sich jedoch auf CMTS (Container-Managed Persistence Contexts, über Container realisierte Transaktionspersistenz) auswirken, d. h., JPA-EntityManagers, die mit @PersistenceContext eingefügt wurden. JPA-API-Methoden setzen voraus, dass eine Ausnahme des Typs TransactionRequiredException ausgelöst wird, wenn der Aufruf außerhalb der Grenzen eines globalen Transaktionskontextes erfolgt. Diese Ausnahme wird weiterhin wie erwartet ausgelöst. Der lokale Transaktionskontext bleibt jedoch weiterhin aktiv. Und der CMTS-Persistenzkontext bleibt ebenfalls aktiv, bis der neue globale Transaktionskontext gestartet wurde bzw. bis der Aufruf des Komponentenservice abgeschlossen ist. Entitäten, die mit der Methode find oder query von einem CMTS-EntityManager innerhalb der Grenzen des lokalen Transaktionskontextes abgerufen werden, werden weiterhin von diesem Persistenzkontext verwaltet und nicht direkt freigegeben. Als Folge dieser Verarbeitung, die bei einigen JPA-Programmierleitfäden wie nicht erwartetes Verhalten bzw. als Unterschiede im Verhalten erscheinen können, wird der Persistenzkontext, der vom lokalen Transaktionskontext aufrecht erhalten wird, verworfen, sobald der globale Transaktionskontext startet, und die Zuordnung der von diesem Persistenzkontext verwalteten Entitäten wird aufgehoben.