JPA-Architektur (Java Persistence API)

Die Datenpersistenz bezeichnet die Fähigkeit, Daten zwischen den Ausführungen einer Anwendung beizubehalten. 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 Java™ Persistence API (JPA) bietet einen Mechanismus zum Verwalten von Persistenz und objektrelationaler Zuordnung sowie Funktionen für die EJB-Spezifikationen.

Die Spezifikation JPA definiert die objektbezogene Zuordnung intern und setzt keine herstellerspezifischen Implementierungen voraus. JPA basiert auf dem Java-Programmiermodell, das gilt für Java EE Umgebungen, aber JPA kann innerhalb einer Java SE-Umgebung zum Testen von Anwendungsfunktionen funktionieren.

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 API "EntityManager" kann Objekte aus einer Datenbank persistent speichern, aktualisieren oder entfernen.
  • Die API "EntityManager" und die Metadaten für die objektbezogene Zuordnung können die meisten Datenbankoperationen abwickeln, ohne dass Sie dazu JDBC- oder SQL-Code schreiben müssten, um die Persistenz aufrechtzuerhalten.
  • JPA stellt eine Abfragesprache bereit, die die unabhängige EJB-Abfragesprache (auch als JPQL bekannt) erweitert. Mit ihr können Objekte abgerufen werden, ohne dass SQL-Abfragen speziell für die Datenbank, mit der Sie arbeiten, geschrieben werden müssen.

JPA ist für den Einsatz innerhalb und außerhalb einer Java-Umgebung konzipiert. Enterprise Edition ( Java EE ) Behälter. 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 EJB unterstützen 3.x Das Programmiermodell muss eine JPA-Implementierung unterstützen, die auch als Persistenzprovider bezeichnet wird. Ein JPA-Persistenzprovider verwendet folgende Elemente, um eine einfachere Persistenzverwaltung in einer EJB-3.x-Umgebung zu ermöglichen:
Persistenzeinheit
Besteht aus den deklarativen Metadaten, die die Beziehung von Entitätsklassenobjekten zu einer relationalen Datenbank beschreiben. 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 Instanz einer "EntityManagerFactory" stellt einen Persistenzkontext dar.
Persistenzkontext
Definiert die Gruppe aktiver Instanzen, die die Anwendung derzeit bearbeitet. Der Persistenzkontext kann manuell oder über Injektion erstellt werden.
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 Instanz eines "EntityManager" stellt einen Persistenzkontext dar. Eine Anwendung in einem Container kann die EntityManager durch Injektion in die Anwendung oder durch Suche im Namespace der Java-Komponente. Wenn die Anwendung ihre Persistenz verwaltet, erhält sie den "EntityManager" aus der "EntityManagerFactory".
Aufmerksamkeit: Injektion des EntityManager wird nur für die folgenden Artefakte unterstützt:
  • EJB-3.x-Session-Beans
  • EJB-3.x-MDBs
  • Servlets, Servletfilter und Listener
  • JSP-Tag-Handler, die die Schnittstellen "javax.servlet. jsp.tagext.Tag" und "javax.servlet.jsp.tagext.SimpleTag" implementieren
  • JavaServer Faces (JSF) verwaltete Beans
  • die Hauptklasse des Anwendungsclients
Entitätsobjekte
Eine einfache Java-Klasse, die in ihrer einfachsten Form eine Zeile in einer Datenbanktabelle 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. Eine Transaktion Eine Transaktion ist immer aktiv, unabhängig davon, ob es sich um einen globalen Transaktionskontext (GTC, Global Transaction Context) oder einen lokalen Transaktionskontext (LTC, Local Transaction Context) mit Threads handelt, die eine verwaltete Komponente bedienen. Diese aktive Transaktion hat zwar keine Auswirkung auf Persistenzkontexte, die von der Anwendung verwaltet werden, (d. h. JPA EntitEntityManager, die über EntityManagerFactories angefordert werden, die mit @PersistenceUnit in eine Anwendung eingefügt werden), beeinflusst aber Persistenzkontext, die vom Container verwaltet werden, (d. h. JPA EntityManager, die mit @PersistenceContext eingefügt werden).

JPA-API-Methoden lösen weiterhin wie erwartet eine Ausnahme des Typs TransactionRequiredException aus, wenn sie außerhalb der Grenzen eines globalen Transaktionskontextes aufgerufen werden. Während der lokale Transaktionskontext aktiv bleibt (bis ein neuer globaler Transaktionskontext gestartet wird oder wenn das Ende des Komponentenserviceaufrufs erreicht ist), bleibt jedoch auch der Persistenzkontext containergesteuerter Transaktionen (CMT, Container-Managed Transactions) aktiv. Wenn der Persistenzkontext aktiv bleibt, bedeutet das, dass von einem CMT EntityManager innerhalb der Grenzen eines lokalen Transaktionskontextes abgerufene Entitäten weiterhin von diesem Persistenzkontext verwaltet und nicht sofort freigegeben werden. Dieses Verhalten kann manche überraschen, weil es gemäß einigen Java-Programmierleitfäden nicht erwartet wid. Sobald jedoch ein globaler Transaktionskontext gestartet wird, wird der aufrecht erhaltene Persistenzkontext verworfen und die von diesem Persistenzkontext verwalteten Entitäten werden freigegeben.