News

 

13.07.2010

Die Gewinner des Holisticon-WM-Tippspiels 2010 spenden den erspielten Gesamtbetrag der Sternenbrücke, einem Hamburger Kinder-Hospiz. Die Sternenbrücke begleitet Familien und ihre kranken Kinder auf deren letztem Stück des Lebensweges. Diese wichtige Unterstützung liegt uns seit Jahren am Herzen. Mit unserem Engagement möchten wir einen kleinen Teil dazu beitragen. Herzlichen Glückwunsch den glücklichen Siegern und vielen Dank für die Spende!

16.05.2010

Holisticon ist auch in diesem Jahr wieder Roundtable-Sponsor der Seacon in Hamburg. mehr…

30.03.2010

Unser neues Agiles Glossar erklärt mehr als 80 Begriffe aus Scrum und anderen agilen Verfahren. mehr…

08.03.2010

Holger Koschek wird auf der REConf 2010 (15.03. bis 18.03.2010, München) den Vortrag Das A-Team: Anforderungsermittlung in agilen Projekten halten. mehr…

08.02.2010

Wir suchen flugs talentierte Java-EE-Entwickler (m/w), die sich zukünftig zum Softwarearchitekten weiterentwickeln möchten. mehr…

02.02.2010

Planning-Poker-Karten gibt es bei uns schon lange. Neu ist unsere ausführliche Regelbeschreibung zu diesem agilen Schätzverfahren. mehr…

30.11.2009

Roman Schlömmer wird auf den OMG Information Days 2009 (01.12. bis 03.12.2009, Düsseldorf / Darmstadt / München) den Vortrag Geschäftsprozesse und Schnittstellen halten. mehr…

28.11.2009

Das Buch Geschichten vom Scrum von Holger Koschek ist beim dpunkt.verlag erschienen. mehr…

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 @Column-Annotation die Annotation @Basic(fetch=FetchType.LAZY), @Basic(fetch=FetchType.EAGER), @Serialized(fetch=FetchType.LAZY) bzw. @Serialized(fetch=FetchType.EAGER) angegeben werden.

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 (fetch=FetchType.EAGER) aus.

 Java Persistence QL-Abfragen

Innerhalb von Java Persistence QL-Abfragen besteht die Möglichkeit, in der FROM-Klausel einer Abfrage eine Fetching-Strategie anzugeben. Diese werden als sogenannte „Fetch Joins“ bezeichnet und sind von der Hibernate HQL inspiriert. Fetch Joins werden dafür genutzt, die Beziehungen zwischen einer Entität und deren abhängigen Enitäten bereits beim Ausführen der Java Persistence QL-Abfrage mit aufzulösen und ein Prefetching der abhängigen Entitäten vorzunehmen. Das originäre Resultset enthält nur die Ergebnismenge der primären Abfrage, d.h. die abhängigen Entitäten sind nicht Bestandteil der Ergebnismenge der Abfrage. Bei der Navigation über Objekte aus dieser Ergebnismenge kann jedoch sehr schnell auf deren abhängigen Objekte zugegriffen werden, da diese bereits vorgeladen worden sind.

 Deklaration von Beziehungen

Bei der Deklaration der Beziehung von einer Entität zu einer anderen durch Verwendung einer der Annotationen @OneToOne, @OneToMany, @ManyToOne, @ManyToMany kann als Element jeder dieser Annotationen (fetch=FetchType.LAZY) oder (fetch=FetchType.EAGER) angegeben werden. Diese Angabe sorgt dafür, dass der Entity Manager die referenzierten Objekte entsprechend der gewählten Strategie sofort oder erst auf konkreten Zugriff hin aus der Datenbank liest bzw. lädt.

Die Angabe der zu verwendenden Fetching-Strategie ist optional. Wird das fetch-Element nicht angegeben, geht die Persistence Provider Runtime von dem Standardverhalten des Eager Loadings (fetch=FetchType.EAGER) aus.

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