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. JPA (Java™ Persistence API) stellt seit den EJB-Spezifikationen 3.0 einen Mechanismus für die Verwaltung von Persistenz und objektrelationaler Zuordnung und Funktionen bereit.
Informationen zur Verwendung von JPA 2.1 und höher mit Libertyfinden 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, aber JPA kann in einer Java SE-Umgebung zum Testen von Anwendungsfunktionen verwendet 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 für den Betrieb innerhalb und außerhalb eines Java Enterprise Edition -Containers (Java EE) konzipiert. 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 eigene Persistenz verwalten, können in einer Containerumgebung oder einer Java SE-Umgebung funktionieren.
Java EE -Container, die das Programmiermodell EJB 3.x unterstützen, müssen eine JPA-Implementierung unterstützen, die auch als Persistenzprovider bezeichnet wird. 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ützungsstrukturen) 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 Suchen im Namespace der Java-Komponente abrufen. 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.