JPA-Glossar
Die Java Persistence API (JPA) wurde im Zuge von EJB 3.0 spezifiziert. Da JPA sowohl im Java-EE- als auch im Java-SE-Umfeld einsetzbar ist, wurde sie in eine eigene Spezifikation ausgegliedert, d.h. Persistenz ist nicht mehr direkter Bestandteil von EJB. Wir haben diesem Umstand mit unserem JPA-Glossar Rechnung getragen. Es entzaubert und erklärt die vielen Fachbegriffe wie Fetching-Strategien, Detached Object, Multi-table Mapping etc. und erklärt, was hinter den Begrifflichkeiten steckt. Lesen Sie auch unser Buch EJB 3 komplett, in dem wir die Themen ausführlich erläutern.
Wenn Sie Begriffe vermissen, die Ihrer Meinung nach erklärt gehören oder falls Sie Fragen haben, mailen Sie uns doch einfach unter
Index
A·B·C·D·E·F·G·H·I·J·K·L·M·N·O·P·Q·R·S·T·U·V·W·X·Y·Z·Alle
| A nach oben | |
| Attached Object | Bezeichnet eine vom EntityManager verwaltete Instanz einer JPA Entity mit den darin enthaltenen Daten aus einer Datenbank. |
| B nach oben |
| C nach oben | |
| Callback-Methoden | Um zu ermöglichen, sich in den Ablauf der Steuerung des Lebenszyklusses einer Persistent Entity einzuklinken, gibt es ein Set von vordefinierten Meta-Annotationen. Diese erlauben, beliebige Methoden in der Klasse zu kennzeichnen, sodass diese in Abhängigkeit der verwendeten Meta-Annotation zu definierten Zeitpunkten aufgerufen werden. Für das Einklinken in die Steuerung des Lebenszyklus von Persistent Entities stehen folgende Meta-Annotationen zur Verfügung: @PrePersist, @PostPersist, @PreRemove, @PostRemove, @PreUpdate, @PostUpate und @PostLoad.
|
| Configuration by Exception | Ziele dieses Configuration by Exception-Ansatzes sind die Minimierung und die Reduzierung von Entwicklungszeiten und Aufwänden für die Konfiguration bzw. Entwicklung von Persistent Entities. Der Entwickler soll nur noch in Ausnahmefällen (daher: Configuration by Exception) konfigurierende oder laufzeitsteuernde Angaben für eine Persistent Entity vornehmen müssen. Nämlich nur in den Fällen, in denen das gewünschte Verhalten von dem definierten und vorgegebenen Standardverhalten abweicht. Es wird also das Ziel verfolgt, die Notwendigkeit der expliziten Angabe von Konfigurationsparametern für allgemein gültiges, erwartetes Verhalten und Anforderungen an die Persistence Provider Runtime zu minimieren bzw. zu reduzieren.
Konkret bedeutet dies, dass eine Menge von Funktionalitäten bzw. Verhaltensweisen per default voreingestellt sind. Dieses Defaultverhalten sollte den Großteil (80–90%) der typischen Anwendungsfälle abdecken. Trifft das Standardverhalten nicht das Anforderungsprofil, dann kann der Entwickler diese Standardwerte bzw. das Standardverhalten leicht übersteuern. Als Beispiel dafür sei angeführt, dass Persistent Entities per default einen Eager Load-Mechanismus verwenden. Will der Entwickler Lazy Load als Fetching-Strategie verwendet haben, muss er dieses explizit angeben. |
| D nach oben | |
| Detached Entity | siehe Detached Object |
| Detached Object | Bezeichnet eine Instanz einer Persistent Entity, die nicht mehr mit ihrem originären Persistence Context assoziiert ist. Damit ist eine Synchronisierung ihrer Daten mit der Datenbank nicht mehr gegeben. Ein solches Objekt wird nicht mehr durch den EntityManager verwaltet; es ist also eine vom EntityManager nicht mehr gemanagte Instanz einer Persistent Entity.
Detached Objects können durch verschiedene Umstände entstehen, beispielsweise dann, wenn eine Instanz einer Persistent Entity serialisiert wird. In diesem Fall ist die serialisierte Form der Persistent Entity ein Detached Object. |
| E nach oben | |
| Eager Load | Bezeichnet eine Fetching-Strategie der Java Persistence API. Einfach gesagt bedeutet Eager Load, dass die Daten einer Persistent Entity sofort vollständig aus der Datenbank gelesen und in die entsprechenden Attribute einer Instanz geschrieben werden. Alle anderen innerhalb der Instanz/des Objektes referenzierten persistenten Objekte (Objektnetze/Objektbäume) werden ebenfalls sofort instanziiert und vollständig geladen.
Bei größeren Objektnetzen oder Objektbäumen kann dieser Ansatz in Verbindung mit einer großen Datenmenge schnell zu langen Ladezeiten und hohem Speicherverbrauch durch eine entsprechende Anzahl an gefüllten Objekten führen. Die Eager Load Fetching-Strategie ist die Standardstrategie, die von der Persistence Provider Runtime angewendet wird, falls keine andere explizite Angabe gemacht wird. Die mögliche Alternative ist Lazy Load. |
| Embeddable Object | Innerhalb einer Persistent Entity können Klassen, die ihrerseits nicht als Persistent Entities gekennzeichnet sind und somit keine eigene persistente Identität haben, in Form von Attributen eingebettet werden. Diese eingebetteten Objekte werden als Embeddable Objects bezeichnet. Gefüllt werden die Attribute aus den Spalten der Tabellen, mit denen die Persistent Entity assoziiert sind.
Es handelt sich hierbei beispielsweise um das Mappen einer Tabelle auf eine Persistent Entity und darin eingebetteter weiterer POJOs (einfacher Java-Klassen), um eine denormalisierte Tabelle auf ein Objektnetz zu projizieren. Persistent Entity mit dem Mapping auf ein Embeddable Object @Entity
@Table(name = “KUNDE”)
public class Kunde
implements java.io.Serializable {
private int id;
private Adresse adresse;
private String name;
private String vorname;
public Kunde(String name, String vorname,
String strasse, String stadt) {
this.adresse =
new Adresse(strasse, stadt);
this.name= name;
this.vorname = vorname;
}
…
@Embedded
@AttributeOverrides({
@AttributeOverride(name = “strasse”,
column = @Column(name = “STRASSE”)),
@AttributeOverride(name = “stadt”,
column = @Column(name = “STADT”)) })
public Adresse getAdresse() {
return adresse;
}
public void setAdresse(
Adresse adresse) {
this.adresse = adresse;
}
@Column(name = “NAME”)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
…
Embeddable Object @Embeddable
public class Adresse
implements java.io.Serializable {
private String strasse;
private String stadt;
…
}
|
| Entity Manager | Hierbei handelt es sich (analog zu Ansätzen aus JDO und Hibernate) um den zentralen Persistenz-Manager. Der EntityManager ist dafür zuständig, die gesamte Persistenzabbildung von persistenten Entitäten zur Verfügung zu stellen. Er kümmert sich um das persistente Neuanlegen von Entitäten in Datenbanken, das Laden, Speichern, Löschen und Suchen. |
| F nach oben | |
| Fetching-Strategie | In der Spezifikation der Java Persistence API sind zwei Fetching-Strategien definiert und aufgeführt: Lazy Load und Eager Load. Im Vergleich zu Hibernate und anderen Persistence Providern wie TopLink sind das noch wenige Optionen. Sowohl aus Zeit- als auch aus Aufwandsgründen sind in der EJB 3.0-Fassung keine weiteren Fetching-Strategien definiert. Eine Detaillierung und Erweiterung der Fetching-Strategien ist voraussichtlich für die kommende Version geplant.
Die Eager Load-Strategie ist innerhalb der Java Persistence API durchweg als Standard voreingestellt. Lazy Load kommt nur dann zur Anwendung, wenn der Entwickler dies explizit angibt. Der Eager Load-Mechanismus ist verpflichtend durch die Hersteller der Persistence Provider Runtimes (z.B. Hibernate) zu implementieren und zur Verfügung zu stellen. Bei Lazy Load ist es zurzeit noch so, dass die Angabe von Lazy Load „lediglich“ als Hinweis für die Persistence Provider Runtime gesehen wird und nicht weiter spezifiziert ist, in welcher konkreten Ausprägung / Umsetzung der Lazy Load-Mechanismus tatsächlich zur Verfügung gestellt und genutzt wird. Momentan sieht es so aus, dass die Umsetzung des Lazy Load-Mechanismus den Herstellern der Persistence Provider Runtimes obliegt und nicht weiter spezifiziert wird. Dies birgt natürlich eine Menge Gefahren wie beispielsweise eine nicht mögliche Gewährleistung der Interoperabilität durch divergierende architektonische und technische Umsetzungen der Hersteller. Wie und wo wird die zu verwendende Fetching-Strategie deklariert? Die Angabe der von der Persistence Provider Runtimes zu verwendenden Fetching-Strategie kann an verschiedenen Elementen im Code erfolgen. Attribute Für jedes persistentes Attribut einer Entität bzw. eines Objektes kann direkt bei den Mapping-Informationen des Attributes die Fetching-Strategie hinterlegt werden. Dazu kann zusätzlich zur Die Angabe der zu verwendenden Fetching-Strategie auf Attributebene ist optional. Wird bei einem persistenten Attribut keine diesbezügliche Angabe vorgenommen, geht die Persistence Provider Runtime von dem Standardverhalten des Eager Loadings Java Persistence QL-Abfragen Innerhalb von Java Persistence QL-Abfragen besteht die Möglichkeit, in der Deklaration von Beziehungen Bei der Deklaration der Beziehung von einer Entität zu einer anderen durch Verwendung einer der Annotationen Die Angabe der zu verwendenden Fetching-Strategie ist optional. Wird das Anzumerken ist, dass diese Informationen auch über die Deployment Deskriptoren angegeben werden können. Als Wertigkeitsregel gilt hier, dass die Deklaration mittels XML im Deployment Deskriptor die Deklaration schlägt, die über Annotationen angegeben worden sind. |
| G nach oben |
| H nach oben |
| I nach oben |
| J nach oben | |
| Java Persistence API | Im Rahmen von EJB 3.0 (JSR220 im Java Community Process) ist die sogenannte Java Persistence API entwickelt worden. Sie ist der Standard für die Persistenzabbildung im Java EE- und Java SE-Bereich.
Ein wichtiges Merkmal der Java Persistence API ist, dass sie für beliebige POJOs verwendet werden kann und nicht (wie früher mit EJB Entity Beans) auf EJBs eingeschränkt ist. Somit steht sie auch den Entwicklern zur Verfügung, die keine EJB-Komponenten in ihren Applikationen benötigen. Beteiligt sind an der Entwicklung die führenden Persistenzexperten aus dem Hibernate-, TopLink- und JDO-Lager. |
| Java Persistence QL | Akronym für Java Persistence Query Language. Siehe Beschreibung Java Persistence Query Language. |
| Java Persistence Query Language | Die Java Persistence Query Language ist die Abfragesprache der Enterprise JavaBeans Komponentenarchitektur. Sie ist angelehnt an SQL, bezieht sich aber auf Objekte. Die Java Persistence Query Language ist im Vergleich zu EJB QL erheblich erweitert und teilweise neu entwickelt worden. Viele grundlegende und wichtige QL-Funktionalitäten, die in EJB QL nicht vorhanden waren, stehen mit der Java Persistence Query Language nun zur Verfügung. Sie hat einen wesentlich größeren Umfang an (wichtigen) Funktionalitäten und ähnelt sehr stark der Hibernate HQL-Abfragesprache. |
| K nach oben |
| L nach oben | |
| Lazy Load | Lazy Load bezeichnet – wie in anderen Persistenzlösungen auch - die Strategie, die persistenten Daten einer Entität (eines Objektes) erst dann aus der Datenbank zu lesen, wenn ein tatsächlicher Zugriff auf das persistente Objekt bzw. dessen Attribute erfolgt. Analog verhält es sich mit referenzierten Objekten innerhalb von persistenten Objektnetzen bzw. Objektbäumen.
Zurzeit wird Lazy Load ausschließlich in der physikalischen Schicht umgesetzt, in der sich auch der Entity Manager in der Persistence Provider Runtime befindet. Dies wird für gewöhnlich der Server sein. Daher ist auf Client-Seite kein Lazy Load-Mechanismus möglich. Dies hat drei Konsequenzen: 1. Der Zugriff eines Clients auf ein nicht geladenes Attribut eines mittels Lazy Load geladenen Detached Objects führt zu einer Exception. 2. Der zuvor beschriebene Zugriff führt eben nicht dazu, dass das Attribut aus der Datenbank geladen wird, da das Detached Object nicht mehr vom Entity Manager (der sich auf dem Server befindet) verwaltet wird, also kein Managed Object mehr ist. 3. Desweiteren werden nicht geladene Assoziationen bei dem Zugriff auf ein Detached Object nicht nachgeladen. Der Grund dafür ist analog dem zuvor angeführten Grund. |
| M nach oben | |
| Managed Object | Bezeichnet eine vom EntityManager überwachte Persistent Entity. “Überwacht” bezieht sich hierbei auf die Steuerung des Persistenzverhaltens der Entität. |
| Meta- Annotationen | Meta-Annotationen sind dynamische Spracherweiterungen der Programmiersprache Java. Sie sind mit dem JDK 1.5 eingeführt worden. Meta-Annotationen ermöglichen es, direkt im Java-Code Meta-Informationen unterzubringen, die sowohl zur Compile- als auch zur Laufzeit ausgewertet werden können. Diese Informationen können u.a. dafür genutzt werden, um Code zu generieren oder das Laufzeitverhalten eines Objektes bzw. einer Komponente zu steuern. |
| Multi-table Mapping | Das Multi-table Mapping bezeichnet die Fähigkeit einer Persistent Entity, auf mehrere physikalische Datenbanktabellen gemappt zu werden. In JPA ist eine Persistent Entity kein “stumpfes” 1:1 Mapping einer Tabelle, sondern vielmehr die technische Hülle für ein logisches Geschäftsobjekt, dessen Daten physikalisch über mehrere Tabellen verteilt sein können. Es wird innerhalb der Persistent Entity über Meta-Annotationen angegeben, aus welchen Tabellen/Feldern die entsprechenden Daten stammen. Der EntityManager sorgt dafür, das relationale Modell zur Laufzeit aufzulösen und die Daten in die Persistent Entity zu übertragen (siehe Abbildung).
Logisches Geschäftsobjekt (Persistent Entity), bestehend aus drei Tabellen @Entity @Table(name = “KUNDE”) @SecondaryTables({ @SecondaryTable(name = “ADRESSE”) @SecondaryTable(name = “TYP”) }) public class Kunde implements java.io.Serializable { private int id; // Aus Tabelle “KUNDE” private String name; // Aus Tabelle “KUNDE” private String vorname ; // Aus Sekundärtabelle “ADRESSE” private String strasse; … // Aus der Haupttabelle “Kunde” @Column(name = “NAME”) public String getName() { return name; } … // Aus der Sekundärtabelle “ADRESSE” @Column(name = “STRASSE”, table = “ADRESSE”) public String getStrasse() { return strasse; } … // Per Default wird, wenn kein @Column // angeben ist, davon ausgegangen, // dass der Spaltenname gleich dem // Attributnamen ist. public String getVorname() { return vorname ; } } |
| N nach oben |
| O nach oben |
| P nach oben | |
| Persistence Provider Runtime | Als Persistence Provider Runtime wird die Laufzeitumgebung der Java Persistence API bezeichnet. Es handelt sich hierbei um die technische Umsetzung der Java Persistence API, die das Persistenzhandling von POJOs liefert. |
| Persistent Entity | Bezeichnet ein Java-Objekt, das in der Datenbank gespeichert ist oder dort gespeichert werden soll. Die entsprechende Java-Klasse wird mit der Annotation @Entity gekennzeichnet. Entities werden durch einen Entity Manager verwaltet.
|
| Q nach oben |
| R nach oben |
| S nach oben |
| T nach oben |
| U nach oben |
| V nach oben |
| W nach oben |
| X nach oben |
| Y nach oben |
| Z nach oben |
Copyright © 2008–2009 Holisticon AG
Dieses Glossar darf in vollständiger Form und unverändert jederzeit kopiert und kostenlos weitergegeben werden. Der Hinweis auf die Originalquelle http://www.holisticon.de/cms/JPAGlossar/Startseite muss ebenso wie dieser Copyright-Hinweis stets angegeben werden. Es ist nicht zulässig, das Glossar kommerziell zu vertreiben, gegen Entgelt weiterzugeben oder Inhalte zu verändern. Im Rahmen nicht-kommerzieller Verwendungen, beispielsweise Diplomarbeiten, darf das Glossar gerne übernommen werden. Die Verwendung in kommerziellen Zusammenhängen, beispielsweise in öffentlichen oder internen Schulungen, firmeninternen Netzwerken, Publikationen, Produkten etc. ist prinzipiell gestattet, wenn eine entsprechende Meldung an gesendet wird. Die Weitergabe ist sowohl in elektronischer als auch gedruckter Form zulässig. Im Internet zugängliche Kopien sind ebenfalls zu melden.
Hinweis zu den Urhebern der dargestellten Abbildungen: Alle hier wiedergegebenen Grafiken wurden von uns erstellt und sind NICHT von Dritten bezogen!
Nehmen Sie Kontakt mit uns auf!
Ihre Ansprechpartner:
| Stefan M. Heldt | Oliver Ihns |
| Telefon: +49 40 5074 2722 |