Datenbanken

Werbung
fbi
h_da
Datenbanken
Kapitel 8: Objekt-relationales Mapping
- eine Einführung -
Schestag
Datenbanken (Cnam)
Kapitel 8 - 1
fbi
h_da
Objekt-relationales Mapping
Inhalte des Kapitels
• Motivation – Impedance Mismatch
• Objekt-relationales Mapping – Bottom Up und Top Down
• EJB 3.0 und die Java Persistence API (JPA)
• Entity-Klassen
• Implementierung von Beziehungen (Assoziationen)
• Persistenzkontext, EntityManager und –Factory im Lifecycle einer Entity
Lernziele
• Kenntnis der möglichen Konflikte bei Architekturen mit objektorientierten
Programmiersprachen und relationalen DBMS als Persistenzschicht
• Verständnis für die Möglichkeiten des Mappings Buttom Up und Top Down
• Grundkenntnisse der EJB 3.0- und JPA-Spezifikation und deren
Implementierung
Schestag
Datenbanken (Cnam)
Kapitel 8 - 2
Motivation ⋅ Impedance Mismatch
fbi
h_da
•
Objektorientierte Programmiersprachen kapseln Daten und Verhalten in Objekten
und benutzen objektorientierte Konzepte wie
– Vererbung
– Objektidentität
– komplexe Beziehungen mit beliebiger Graphennavigation.
•
Relationale Datenbanken basieren auf der Relationen-Algebra und repräsentieren
Daten in zweidimensionalen Tabellen.
Wichtige Konzepte:
– Primärschlüssel mit PK-Constraints
– Fremdschlüssel mit FK-Constraints
– eingeschränkte Graphennavigation (Fremdschlüsselspalten dürfen nicht
mehrwertig sein – warum?)
⇒ Die Konflikte, die aus den Strukturunterschieden zwischen beiden Systemen
entstehen, bezeichnet man auch als Impedance Mismatch.
lat. impedire: hemmen, hindern · Impedance = Wechselstromwiderstand in der
Elektrotechnik
Schestag
Datenbanken (Cnam)
Kapitel 8 - 3
Impedance Mismatch
Objektorientierte
Applikation
?
?
Relationale
Datenbank
Schestag
fbi
h_da
Objektmodell – oo Klassendiagramm
Objekte
Collections
OIDs
Vererbung
…
Wer mappt wie?
Welches ist das „führende“ System?
Relationenmodell
Relationen
elementare Datentypen
PK-Constraints
FK-Constraints
…
Datenbanken (Cnam)
Kapitel 8 - 4
fbi
h_da
Impedance Mismatch - Datentypen
Komplexe vs. elementare Datentypen
• Objekte können beliebig komplexe Eigenschaften haben …
Kunde
0..*
Adresse
1..1
•
… während Relationen (Tabellen) nur Attribute (Spalten) mit elementaren
Datentypen enthalten dürfen:
Kunde
Knr
…
Adr_Strasse
Adr_Land
Adr_PLZ
Adr_Ort
Schestag
Kunde
oder
Knr
…
Adresse
Kunde.Knr =
Adresse.Knr
Datenbanken (Cnam)
Knr
lfdNr
Adr_Strasse
Adr_Land
Adr_PLZ
Adr_Ort
Kapitel 8 - 5
fbi
h_da
Impedance Mismatch - Identitäten
Objektidentität vs. Primärschlüssel
• Zwei Objekte (in Java) sind gleich, wenn ihre Eigenschaften identische
Werte enthalten. Sie sind jedoch nur dann identisch, wenn sie die gleiche
Objektidentität haben.
Objektgleichheit in Java:
object1.equals(object2);
•
Objektidentität in Java:
object1 == object2
Zwei Datensätze einer Tabelle sind dann gleich, wenn ihre Spaltenwerte
identisch sind.
Sind sie dann auch identisch?
Schestag
Datenbanken (Cnam)
Kapitel 8 - 6
Impedance Mismatch - Vererbung
•
fbi
h_da
Vererbung
Das Konzept der Vererbung ist in allen objektorientierten Sprachen
fundamental verankert.
Welche (unterschiedlichen) Implementierungsmöglichkeiten in einem
Relationenmodell gibt es für eine Vererbungshierarchie, die in einem E/RDiagramm modelliert wurde?
Person
IS-A
Kunde
Schestag
Mitarbeiter
Datenbanken (Cnam)
Kapitel 8 - 7
fbi
h_da
Impedance Mismatch - Beziehungen
Beziehungen
• Sowohl zwischen Objekten als auch zwischen Entitäten einer relationalen
Datenbank gibt es die folgenden Beziehungstypen:
1:1, 1:n und n:m.
•
Die Implementierung von Beziehungen erfolgt
– objektorientiert durch Referenzattribute (Objektidentitäten oder Collections von
Objektidentitäten)
– relational durch Fremdschlüsselspalten (Wert der referenzierten
Primärschlüsselspalte)
⇒ Eine n:m-Beziehung muss relational immer in zwei 1:n-Beziehungen
aufgelöst werden: es entsteht eine dritte Tabelle (Relation).
Schestag
Datenbanken (Cnam)
Kapitel 8 - 8
fbi
h_da
Impedance Mismatch - Graphennavigation
Graphennavigation
• Die Implementierung von Beziehungen durch Objektreferenzen erlaubt eine
direkte Navigation auf den assoziierten Objekten bzgl. einer Beziehung.
Beispiel: „Alle Bestellungen eines Kunden“
•
kunde.getBestellungen();
In relationalen Datenbanken ist eine Graphennavigation nicht möglich, da
ausschließlich über Werte und nicht über Objektreferenzen referenziert
wird.
Lese mit einem DB-Zugriff den Datensatz des Kunden, und mit einem weiteren alle
Bestellungen des Kunden … oder
… lese die zwei Tabellen auf der DB, um dort eine Verbundoperation (Join)
durchführen zu können:
select * from kunde k, bestellung b where k.knr = b.knr;
⇒ Wie kann man verhindern, dass man beim Iterieren über alle Kunden und
gleichzeitigem Zugriff auf deren Bestellungen nicht jedes Mal eine Anfrage
zur Datenbank schickt (1+N-Problem) → Fetching-Strategien!
Schestag
Datenbanken (Cnam)
Kapitel 8 - 9
Impedance Mismatch - Graphennavigation
Bestellungsposten
Bestellung
int bposten_id
<<association impl.>>
Bestellung bestellung
Artikel artikel
int bestellung_id
<<association impl.>>
Benutzer benutzer
Collection bposten
Artikel
Benutzer
int artikel_id
<<association impl.>>
Kategorie kategorie
Collection bposten
int benutzer_id
benutzer_name
<<association impl.>>
Gruppe gruppe
Collection bestellungen
Kategorie
Gruppe
int kategorie_id
<<association impl.>>
Collection artikel
int gruppe_id
<<association impl.>>
Collection benutzer
Schestag
fbi
h_da
-- Alle Benutzerinstanzen namens 'Schmidt‘
String query =
"select b from Benutzer b
where b.benutzer_name = :name";
List<Benutzer> =
em.createQuery(query).
setParameter("name","Schmidt").
getResultList();
Datenbanken (Cnam)
Welche
WelcheInstanzen
Instanzenwerden
werden
bei
beidieser
dieserQuery
Query
geladen?
geladen?
Kapitel 8 - 10
Impedance Mismatch - Graphennavigation
•
fbi
h_da
Mit allen drei Benutzer-Instanzen k1, k2 und k3 namens 'Schmidt' sind die
zugehörigen Instanzen vom Typ Bestellung, Bestellungsposten, Artikel,
Kategorie und Gruppe assoziiert …
b1:Bestellung
k1:Benutzer
bp1:Bestellungsposten
a1:Artikel
bp2:Bestellungsposten
a2:Artikel
bp3:Bestellungsposten
a3:Artikel
k1:kategorie
bp4:Bestellungsposten
k2:kategorie
b2:Bestellung
bp5:Bestellungsposten
…
g1:Gruppe
a4:Artikel
…
…
k2:Benutzer
b3:Bestellung
…
…
…
k3:Benutzer
…
Schestag
…
g2:Gruppe
… und auch diese haben wiederum
assoziierte Objekte.
Datenbanken (Cnam)
Kapitel 8 - 11
fbi
h_da
Objekt-relationales Mapping
9 Motivation – Impedance Mismatch
•
Objekt-relationales Mapping – Bottom Up und Top Down
•
EJB 3.0 und die Java Persistence API (JPA)
•
Entity-Klassen
•
Implementierung von Beziehungen (Assoziationen)
•
Persistenzkontext, EntityManager und –Factory im Lifecycle einer Entity
Schestag
Datenbanken (Cnam)
Kapitel 8 - 12
fbi
h_da
Objekt-relationales Mapping
•
Ein Lösungsansatz zur Behebung der Konflikte des (objektrelationalen) Impedance Mismatch ist ein möglichst automatisiertes,
transparentes objekt-relationales Mapping.
•
Unter objekt-relationalem Mapping (O/R-Mapping) versteht man ein
Mapping zwischen einem objektorientierten Modell (Klassendiagramm) und einem Relationenmodell bzw. dem Schema der DB.
•
Ziel ist es, dieses Mapping weitestgehend automatisiert vornehmen
zu lassen bei gleich bleibender Nutzung der Vorteile einer
objektorientierten Programmiersprache und einer relationalen
Persistenzschicht.
•
Frameworks wie z.B. Hibernate (www.hibernate.org) unterstützen
ein solches O/R-Mapping. Man spricht auch von O/R-Mappern.
Schestag
Datenbanken (Cnam)
Kapitel 8 - 13
fbi
h_da
Objekt-relationales Mapping - Strategien
•
Zwei Strategien des O/R-Mapping:
– Top-Down: Erstelle ein Objektmodell und mappe auf ein relationales
Datenbankschema.
– Bottom-Up: Erstelle ein relationales Datenbankschema und mappe auf
ein Objektmodell.
– Alle Erweiterungen des Modells bzw. Schemas erfolgen dann in der
Regel gemäß der gewählten Strategie.
Schestag
Datenbanken (Cnam)
Kapitel 8 - 14
OR Mapping – Bottom Up und Top Down
UML-Editor
fbi
h_da
UML-Editor
CASE-Tool getrieben
Java
… oder direkt durch
Codierung in der
Entity-Klasse
de.hDa.webshop.entity.jpa
+ - EntityX.java
+ - EntityY.java
+ - EntitiyZ.java
+-…
Schestag
Java
de.hDa.webshop.entity.jpa
+ - EntityX.java
+ - EntityY.java
+ - EntitiyZ.java
+-…
OR-Mapper
OR-Mapper
DB
DB
Bottom-Up
Top-Down
Datenbanken (Cnam)
Kapitel 8 - 15
fbi
h_da
Objekt-relationales Mapping
9 Motivation – Impedance Mismatch
9 Objekt-relationales Mapping – Bottom Up und Top Down
•
EJB 3.0 und die Java Persistence API (JPA)
•
Entity-Klassen
•
Implementierung von Beziehungen (Assoziationen)
•
Persistenzkontext, EntityManager und –Factory im Lifecycle einer Entity
Schestag
Datenbanken (Cnam)
Kapitel 8 - 16
fbi
h_da
EJB – Enterprise Java Beans
•
EJB 1.0 – Final Specification 1997
– serverseitiges Komponentenmodell, mit dem (verteilte) Geschäftsobjekte
entwickelt und dann durch EJB-Container verwaltet werden.
– Komponenten = Enterprise Beans: Session Beans, Entity Beans,
Messagedriven Beans
•
EJB 1.1 – erste Verbesserung 1999, zusammen mit J2EE
– Container- und BeanManaged Persistence (CMP, BMP)
– noch keine Unterstützung von Beziehungsfeldern
•
EJB 2.0 – 2001
– Neuerungen in der Container Managed Persistence (CMP), die nicht
abwärtskompatibel sind
•
EJB 2.1 – 2002
– zustandslose Session-Beans (Web Services)
– Erweiterungen EJB QL (Aggregatfunktionen, …)
Schestag
Datenbanken (Cnam)
Kapitel 8 - 17
EJB 3.0 und die Java Persistence API ⋅ JPA
•
fbi
h_da
EJB 3.0 – JSR 220*) – Final Release 2006
– Ziel: Vereinfachung von Java EE
– ist Bestandteil der Java Enterprise Edition 5.0 Plattform (JEE)
– EJB 3.1, November 2008: „kosmetische Änderungen“
→ Java Persistence API – JPA 1.0
– eigenständiger Bestandteil der EJB-3.0-Spezifikation
– löst die Entity Beans ab
– Java Persistence Query Language – JPQL
•
•
wurde im Vergleich zu EJB 2.0 erweitert
JPA 2.0 – JSR 317 – Final Release 2009
– ist Bestandteil der Java Enterprise Edition 6.0 Plattform (JEE)
– Ergänzung verschiedener Feature sowohl im Bereich der Funktionalität (u.a.
ElementCollection) als auch im Bereich Performance (u.a. Locking Strategien)
– Integration diverser proprietärer Erweiterungen in den Standard
*) http://jcp.org/aboutJava/communityprocess/final/jsr220/index.html
Schestag
Datenbanken (Cnam)
Kapitel 8 - 18
EJB 3.0 und die Java Persistence API ⋅ JPA
fbi
h_da
•
Im Rahmen der EJB 3.0-Spezifikation erfolgte eine Standardisierung
– der Java Persistence API als Basis-API und
– der Metadaten für die objekt-relationalen Persistenz-Mechanismen.
•
•
Darstellung der Entitäten erfolgt durch POJO – Plain old Java Objects.
Zur Definition der Metadaten werden Java Annotations (seit Java 5.0) verwendet.
Zuvor verwendete XML Deskriptor-Dateien können nach wie vor alternativ verwendet
werden.
→ Die JPA ist nicht auf den Einsatz unter Java EE begrenzt, sondern kann auch unter
Java SE, also außerhalb eines Java EE Containers, eingesetzt werden.
→ Es handelt sich bei der JPA um eine Spezifikation und NICHT um ein fertiges
Framework!
– Implementierungen u.a. Hibernate, Oracle TopLinkEssentials1, EclipseLink2,
Apache OpenJPA, Bea Kodo, …
1)
2)
Referenzimplementierung für JPA 1.0
Referenzimplementierung für JPA 2.0
Schestag
Datenbanken (Cnam)
Kapitel 8 - 19
fbi
h_da
Objekt-relationales Mapping
9 Motivation – Impedance Mismatch
9 Objekt-relationales Mapping – Bottom Up und Top Down
9 EJB 3.0 und die Java Persistence API (JPA)
•
Entity-Klassen
•
Implementierung von Beziehungen (Assoziationen)
•
Persistenzkontext, EntityManager und –Factory im Lifecycle einer Entity
Schestag
Datenbanken (Cnam)
Kapitel 8 - 20
fbi
h_da
JPA – Entity-Klassen (Entities)
•
•
Entity-Klassen können abstrakte oder konkrete Java-Klassen sein, sie
müssen nicht abgeleitet sein. Entities und andere Java-Klassen können
innerhalb einer Vererbungshierarchie beliebig kombiniert werden.
Vererbung, polymorphe Abfragen und polymorphe Assoziationen werden
von Entities unterstützt.
Bedingungen an Entity-Klassen
• Markierung mit Annotation @Entity ist erforderlich.
• Ein parameterloser Konstruktor (public oder protected) muss enthalten
sein.
• Sie dürfen nicht als final deklariert sein, ebenso nicht ihre Methoden und
die persistenten Attribute.
• Das Serializable-Interface muss implementiert sein.
• Sie müssen einen Primärschlüssel enthalten (Annotation @Id).
• Persistente Attribute können durch Annotations (direkt oder bei ihren
Getter-Methoden) Mapping- und andere Metainformationen erhalten.
Schestag
Datenbanken (Cnam)
Kapitel 8 - 21
JPA – Entity-Klassen (Entities)
•
fbi
h_da
Beispiel für eine Entity-Klasse mit Mappinginformationen als
Annotation:
@Entity
public class Bestellung implements Serializable{
@Id
private Long id;
@ManyToOne
private Kunde kunde;
public Kunde getKunde() {
return kunde;
}
public Bestellung() {} // Default Konstruktor
}
//weitere Getter- und Setter-Methoden
…
Schestag
Datenbanken (Cnam)
Kapitel 8 - 22
fbi
h_da
JPA – Primärschlüssel einer Entity
•
Als Primärschlüssel kann
– ein einfaches Attribut oder
– ein zusammengesetzter Schlüssel
einer Klasse verwendet werden.
•
Zusammengesetzte Primärschlüssel erfordern die Definition einer
Primärschlüsselklasse:
– primitive Typen für Instanzvariablen (incl. Wrapper, String, Date)
– public class und parameterloser Konstruktor
– Serializable implementieren
– equals() und hashcode() definieren.
•
Einbindung eines zusammengesetzten Primärschlüssels:
– Embeddable Klasse: instanziiere die Primärschlüsselklasse in
der zugehörigen Enitty-Klasse, oder
– die Entity-Klasse enthält alle Attribute der
Primärschlüsselklasse, die Attribute werden einzeln gemappt.
Schestag
Datenbanken (Cnam)
Kapitel 8 - 23
fbi
h_da
Objekt-relationales Mapping
9 Motivation – Impedance Mismatch
9 Objekt-relationales Mapping – Bottom Up und Top Down
9 EJB 3.0 und die Java Persistence API (JPA)
9 Entity-Klassen
•
Implementierung von Beziehungen (Assoziationen)
•
Persistenzkontext, EntityManager und –Factory im Lifecycle einer Entity
Schestag
Datenbanken (Cnam)
Kapitel 8 - 24
JPA – Beziehungen
•
fbi
h_da
Die JPA unterstützt die folgenden Beziehungstypen mit ihren Annotationen:
–
–
–
–
1:1 mit der Annotation @OneToOne,
1:n mit der Annotation @OneToMany,
n:1 mit der Annotation @ManyToOne,
n:m mit der Annotation @ManyToMany.
Relationenmodell
• In der Regel sind nur unidirektionale Beziehungen möglich – außer im Fall
einer 1:1-Beziehung.
– Wie vermeidet man hier das Problem zirkularer Beziehungen?
JPA
• Es werden uni- und bidirektionalen Beziehungen unterstützt.
• Bei bidirektionalen Beziehungen gibt es genau einen „Besitzer“ und genau
eine „referenzierte Seite“:
Schestag
Datenbanken (Cnam)
Kapitel 8 - 25
JPA – bidirektionale Beziehungen
•
•
fbi
h_da
Diejenige Entity, die die referenzierte Seite repräsentiert, muss auf ihren
„Besitzer“ durch die Angabe des Feldes mappedBy der entsprechenden
Relationship-Annotation verweisen.
Die „n“-Seite einer bidirektionalen Beziehung muss die „Besitzer“-Seite
sein (der „Besitzer“ des Fremdschlüssels in der Datenbank!).
Kunde
…
- Collection<Bestellung>
bestellungen;
1..1
referenzierte Seite
1..*
Besitzer
@Entity
public class Kunde … { …
@OneToMany(mappedBy = "kunde")
private Collection<Bestellung> bestellungen =
new HashSet();
public Collection<Bestellung> getBestellungen() {
return bestellungen;
}
…
Wert des mappedBy-Attributes = Name
des Referenzattributes in der Besitzer-Klasse.
}
Schestag
Bestellung
…
- Kunde kunde;
@Entity
public class Bestellung … {
…
@ManyToOne
private Kunde kunde;
public Kunde getKunde() {
return kunde;
}
…
}
Datenbanken (Cnam)
Kapitel 8 - 26
fbi
h_da
JPA – Annotation von Referenzattributen
•
Die Relationship kann annotiert werden
– am Referenzattribut (= Standard beim NetBeans Re-Engineering):
@OneToMany(mappedBy = "kunde")
Annotation des Referenzattributes
private Collection<Bestellung> bestellungen = new HashSet();
– an der get-Methode des Referenzattributes:
private Collection<Bestellung> bestellungen = new HashSet();
@OneToMany(mappedBy = "kunde")
public Collection<Bestellung> getBestellungen() {
return bestellungen;
}
public void setBestellungen(Collection<Bestellung> b) {
this.bestellungen = b ;
Annotation der get-Methode für das Referenzattribut
}
Schestag
Datenbanken (Cnam)
Kapitel 8 - 27
JPA – Besitzer ⋅ referenzierte Seite
fbi
h_da
•
Bei einer 1:1-Beziehung ist diejenige Entity Besitzer, die in der Datenbank
den Fremdschlüssel enthält.
•
Bei einer n:m-Beziehung kann die Besitzerseite frei gewählt werden.
Vererbung
• Die neue JPA unterstützt erstmals vollständig das Konzept der Vererbung.
Details hierzu s. Literatur!
Schestag
Datenbanken (Cnam)
Kapitel 8 - 28
JPA – n:m-Beziehungen (1)
•
fbi
h_da
Wie werden n:m-Beziehungen im Relationenmodell umgesetzt?
Student 1..*
Vorlesung
1..*
•
Unidirektionale Variante:
@Entity
public class Student … {
…
}
…
}
Schestag
@Entity
public class Vorlesung … {
…
@ManyToMany
private Collection<Student> studenten = new HashSet();
public Collection<Student> getStudenten() {
return studenten;
}
…
}
Datenbanken (Cnam)
Kapitel 8 - 29
fbi
h_da
JPA – n:m-Beziehungen (2)
•
Bidirektionale Variante:
Student
1..*
referenzierte Seite
Vorlesung
1..*
Besitzer
•
Nicht vergessen: Konsistenz der Bidirektionalität muss in der Anwendung
sichergestellt werden!
@Entity
public class Student … {
…
@ManyToMany(mappedBy = "studenten")
private Collection<Vorlesung> vorlesungen =
new HashSet();
public Collection<Vorlesung> getVorlesungen() {
return vorlesungen;
}
…
}
Schestag
@Entity
public class Vorlesung … {
…
@ManyToMany
private Collection<Student> studenten =
new HashSet();
public Collection<Student> getStudenten() {
return studenten;
}
…
}
Datenbanken (Cnam)
Kapitel 8 - 30
fbi
h_da
JPA – n:m-Beziehungen (3)
•
Ergebnis in der Datenbank
Student
id
name
…
•
id = studenten_id
Vorlesung_Student
Vorlesung
vorlesungen_id = id
vorlesungen_id
studenten_id
id
titel
…
Der Name der Verbindungstabelle kann mit Hilfe von Annotationen
spezifiziert werden, ebenso die Namen der Fremdschlüsselattribute:
@Entity
public class Vorlesung … {
…
@ManyToMany
@JoinTable (name = "Belegung",
joinColumns = @JoinColumn(name="v_id"),
inverseJoinColumns = @JoinColumn(name="s_id")
)
private Collection<Vorlesung> vorlesungen = new HashSet();
…
}
Schestag
Datenbanken (Cnam)
Belegung
Ö
v_id
s_id
Kapitel 8 - 31
JPA – n:m-Beziehungen (4)
fbi
h_da
•
ACHTUNG: Verwendet man in der Anwendung die JPA-API und Hibernate
als JPA-Persistence-Provider werden die Primärschlüssel in der JoinTabelle nicht automatisch erzeugt.
– Anmerkung: Verwendet man stattdessen direkt die Hibernate-API wird
ein passender Primärschlüssel erzeugt.
•
Work-around: Verwendung von @UniqueConstraints:
@Entity
public class Vorlesung … {
…
@ManyToMany
@JoinTable (name = "Belegung“,
joinColumns = @JoinColumn(name="v_id"),
inverseJoinColumns = @JoinColumn(name="s_id")
uniqueConstraints = @UniqueConstraint(columnNames={v_id, s_id})
)
private Collection<Vorlesung> vorlesungen = new HashSet();
…
}
Schestag
Datenbanken (Cnam)
Kapitel 8 - 32
fbi
h_da
JPA – n:m-Beziehungen (5)
•
•
m:n-Beziehungen können Beziehungsattribute haben (in unserem Beispiel:
Note)
Lösung: Assoziation muss als eigene Klasse modelliert werden
Ö zwei 1:n Beziehungen
Student 1..1
Note
id
1..* note
Vorlesung
1..*
1..1
@Entity
public class Note … {
@Id
@GeneratedValue
private Long id;
private float note;
…
@ManyToOne
private Student student;
@ManyToOne
private Vorlesung vorlesung;
…
}
Schestag
Datenbanken (Cnam)
Kapitel 8 - 33
fbi
h_da
JPA – Collections (1)
•
Mehrwertige Assoziationen zwischen Entities werden als Collections
innerhalb der Javaklassen implementiert –
→ die Collection ist der Datentyp des Referenzattributes, durch das
eine mehrwertige Assoziation implementiert wird.
•
Auch Value-Types (s. Komponenten) können innerhalb einer Entität als
Collection definiert werden.
•
Interfaces, die verwendet werden können, um Collections als Typ für
Attribute von persistenten Klassen zu deklarieren:
- java.util.Set
– java.util.Collection
– java.util.List
– java.util.Map
sowie selbst definierte Interfaces auf der Basis der Implementierung von
org.hibernate.usertype.UserCollectionType.
Schestag
Datenbanken (Cnam)
Kapitel 8 - 34
fbi
h_da
JPA – Collections (2)
•
Persistentes Speichern von Collection-Instanzvariablen erfolgt
automatisch, wenn sie von einer Entität referenziert werden.
•
Löschen von Collection-Instanzvariablen erfolgt nur automatisch bei
explizitem delete cascade.
→ Eine Entität kann nicht in zwei Collections auftauchen.
→ Hibernate kann in einer Collection keine NULL-Werte speichern.
Schestag
Datenbanken (Cnam)
Kapitel 8 - 35
fbi
h_da
Objekt-relationales Mapping
9 Motivation – Impedance Mismatch
9 Objekt-relationales Mapping – Bottom Up und Top Down
9 EJB 3.0 und die Java Persistence API (JPA)
9 Entity-Klassen
9 Implementierung von Beziehungen (Assoziationen)
•
Persistenzkontext, EntityManager und –Factory im Lifecycle einer Entity
Schestag
Datenbanken (Cnam)
Kapitel 8 - 36
fbi
h_da
JPA – Persistenzkontext
„A persistence context is a set of managed entity instances in which for
any persistent entity identity there is a unique entity instance.
Within the persistence context, the entity instances
and their lifecycle are managed by the
entity manager.“ [JSR 220]
DB-Schema
Entity-Klassen
EntityManager
arbeitet mit Instanzen von Entity-Klassen
im jeweiligen Persistenz-Kontext
Schestag
Datenbanken (Cnam)
Kapitel 8 - 37
fbi
h_da
JPA – Entity-Manager
•
Die Verwaltung der Entities erfolgt durch einen Entity Manager: er erzeugt, ändert,
löscht und sucht Entity-Instanzen.
– Container-Managed Entity Manager – nur für Java EE Container
– Application-Managed Entity Manager – von der Anwendung selbst verwaltet.
•
Der Persistenzkontext umfasst eine Menge von Entity-Instanzen, die zu jedem
Datensatz einer Entität der Datenbank jeweils höchstens ein Java-Objekt enthält.
•
Gültigkeitsdauer eines Persistenzkontext:
– transaction-scoped: Gültigkeitsdauer = Dauer einer Transaktion
⇒ Persistenzkontext wird nach Ablauf der Transaktion geschlossen
– extended: Gültigkeitsdauer kann mehrere Transaktionen umfassen
⇒ Persistenzkontext muss explizit über den Entity Manager geschlossen
werden.
Ein Entity Manager ist immer genau einem Persistenzkontext zugeordnet.
Schestag
Datenbanken (Cnam)
Kapitel 8 - 38
fbi
h_da
JPA – Entity-Manager-Factory
•
Entity Manager-Instanzen werden von der Instanz einer Entity ManagerFactory zur Verfügung gestellt.
EntityManagerFactory
1
*
DB-Schema
Entity-Klassen
EntityManager
arbeitet mit Instanzen von Entity-Klassen
im jeweiligen Persistenz-Kontext
Schestag
Datenbanken (Cnam)
Kapitel 8 - 39
JPA – Entity-Manager-Factory
fbi
h_da
Eine EntityManagerFactory
• hält in ihrem Cache Mappingdaten und die generierten SQL-Anweisungen
und
• kann für die Anwendung EntityManager-Instanzen erzeugen …
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
…
private static EntityManagerFactory emf;
static {
try {
emf = Persistence.createEntityManagerFactory(persistenceUnitName);
}
catch (Throwable ex) {
// Fehlermeldung …
}
};
Schestag
Datenbanken (Cnam)
Kapitel 8 - 40
fbi
h_da
JPA – Persistence Unit
•
Eine Persistence Unit ist eine logische Einheit, der
– eine EntityManagerFactory mit deren
– zugehörigen EntityManagern zugeordnet wird, ebenso alle
– mit @Entity versehenen Klassen und
– deren Mappingkonfigurationen.
•
Eine Persistence Unit wird über die xml-Datei persistence.xml
beschrieben, die sich im Verzeichnis WEB-INF/classes/META-INF
befindet.
•
In der Konfigurationsdatei persistence.xml können beliebig viele
Persistence Units definiert werden.
Schestag
Datenbanken (Cnam)
Kapitel 8 - 41
JPA – Persistence Unit
•
fbi
h_da
Ausschnitt aus der Definition einer Persistence Unit aus der Datei
persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="JavaWebshopHdaPU" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="hibernate.connection.username" value="…"/>
<property name="hibernate.connection.driver_class" value="…"/>
<property name="hibernate.connection.password" value="…"/>
<property name="hibernate.connection.url" value="…"/>
…
</properties>
</persistence-unit>
Schestag
Datenbanken (Cnam)
Kapitel 8 - 42
fbi
h_da
JPA – Persistence Unit
•
„A persistence unit defines the set of all classes that are related or
grouped by the application and which must be colocated in their mapping to
a single database.“ [JSR 220]
Verbindungsaufbau über ausgewählten
Treiber, url, user, pwd
PersistenceUnit
DB-Schema
EntityManagerFactory
*
1
*
*
Entity-Klassen
EntityManager
arbeitet mit Instanzen von Entity-Klassen
im jeweiligen Persistenz-Kontext
Schestag
Datenbanken (Cnam)
Kapitel 8 - 43
fbi
h_da
JPA – Entity-Manager
•
Beispiel für die Verwendung eines transaction-scoped Entity Managers:
// Neuen EntityManager erstellen
EntityManager em = emf.createEntityManager();
// Transaktion starten
em.getTransaction().begin();
Kunde kunde1 = em.find(Kunde.class, new Long(123));
kunde1.setName(“Schmidt“); // verwaltete Entity
Kunde kunde2 = new Kunde();
kunde2.setName(“Meyer“); // neue Entity
em.persist(kunde2); // verwaltete Entity
em.getTransaction().commit();
emf = Instanz der
EntityManagerFactory
em.find(…) lädt eine
Kundeninstanz aus der DB
in den Persistenzkontext
kunde1.setName(…) weist
der Kundeninstanz im Persistenzkontext einen neuen
Namen zu.
kunde2 wird instanziiert
und Werte werden zugewiesen.
persist(kunde2) übernimmt kunde2 in den Persistenzkontext.
commit() macht alle Änderungen persistent.
Schestag
Datenbanken (Cnam)
Kapitel 8 - 44
fbi
h_da
JPA – Entity-Manager
•
Beispiel für die Verwendung eines transaction-scoped Entity Managers:
Kunde
Kunde
Id
Name
Id
Name
…
123
Schmitt
123
124
Schmidt
Meyer
…
…
em. … .commit();
em.find(…);
Persistenzkontext von em
Persistenzkontext von em
123 | Schmitt Schmidt
123 | Schmidt
kunde1.setName(…);
NULL | Meyer
em.persist(kunde2);
124 | Meyer
Kunde kunde2 = new Kunde();
…
Schestag
Datenbanken (Cnam)
Kapitel 8 - 45
fbi
h_da
JPA – Lebenszyklus einer Entity
•
•
•
•
New – kein Persistenzkontext, keine DB-Repräsentation, keine Id
Managed – wird in Persistenzkontext verwaltet, DB-Repräsentation
Detached – momentan kein Persistenzkontext, DB-Repräsentation
Removed – Zuordnung zu Persistenzkontext, DB-Repräsentation, zum Löschen
freigegeben :
Detached
hat Datenbankrepräsentaion
befindet sich im
Persistenzkontext
New
Schestag
Managed
Datenbanken (Cnam)
Removed
Kapitel 8 - 46
fbi
h_da
JPA – Query API und EJB QL
•
Zur Formulierung von Queries stehen sowohl
– die EJB QL (aus früheren EJB-Versionen), erweitert um neue Features (z.B.
Polymorphie von Queries), als auch
– SQL-Anweisungen zur Verfügung.
•
Vorteil der EJB QL:
– Datenbankunabhängigkeit
– gute Portabilität
•
Vorteil von SQL-Queries:
– EJB QL nicht ausreichend
– Nutzung von DBMS-spezifischen SQL Features gewünscht
•
Das Query Interface enthält zahlreiche Methoden zur Angabe von Parametern sowie
zur Durchführung der durch das Query-Objekt repräsentierten Anfrage (Details s.
Literatur!).
Schestag
Datenbanken (Cnam)
Kapitel 8 - 47
fbi
h_da
Objekt-relationales Mapping
9 Motivation – Impedance Mismatch
9 Objekt-relationales Mapping – Bottom Up und Top Down
9 EJB 3.0 und die Java Persistence API (JPA)
9 Entity-Klassen
9 Implementierung von Beziehungen (Assoziationen)
9 Persistenzkontext, EntityManager und –Factory im Lifecycle einer Entity
Schestag
Datenbanken (Cnam)
Kapitel 8 - 48
fbi
h_da
Exkurs Hibernate
•
Hibernate implementiert die JPA-Spezifikationen und unterstützt mit folgenden
Komponenten sowohl Java- als auch .NET-Anwendungs-entwicklung*):
•
•
Hibernate Core: Persistenzengine des Hibernate Frameworks
Hibernate Annotations: implementiert die durch die JPA standardisierten
Annotations sowie weitere, hibernate-spezifische Annotations
Hibernate Entity Manager: sowohl innerhalb eines Java EE Containers als auch als
Standalone Lösung außerhalb eines Containers einsetzbar
•
*) in Anlehnung an http://www.hibernate.org/
Schestag
Datenbanken (Cnam)
Kapitel 8 - 49
Exkurs Hibernate-Architektur
•
•
fbi
h_da
Die Nutzung des Hibernate-Framworks ist „skalierbar“, was die Nutzung der
Komponenten von Hibernate betrifft.
Die Anwendung nutzt nur einen minimalen Teil von Hibernate …
Anwendung
Anwendung
Persistente
PersistenteObjekte
Objekte
Enthält die Beschreibungen aller
PersistenceUnits (PU) des
aktuellen Projektes (s.u.)
Hibernate
Hibernate
persistence.xml
persistence.xml
hibernate.cfg.xml
hibernate.cfg.xml
hibernate.properties
hibernate.properties
Mapping
Mapping
Annotations
Annotations/ /XML
XML
Datenbank
Datenbank
Schestag
Datenbanken (Cnam)
Kapitel 8 - 50
Exkurs Hibernate-Architektur
•
fbi
h_da
… oder sie nutzt viele Komponenten von Hibernate: die Anwendung muss
sich dann nicht um JDBC, JTA, JNDI etc. kümmern, da dies alles in
Hibernate gekapselt wird:
Transiente
Transiente
Objekte
Objekte
Wrapperklasse
EntityManager
Factory
Anwendung
Anwendung
SessionFactory
SessionFactory
Transaction
Transaction
Factory
Factory
JNDI
JNDI
Connection
Connection
Provider
Provider
PersiPersistente
stente
Objekte
Objekte
Wrapperklasse
EntityManager
Session
Transaction
Session Transaction
JDBC
JDBC
JTA
JTA
Datenbank
Datenbank
Schestag
Datenbanken (Cnam)
Kapitel 8 - 51
Exkurs Hibernate-Architektur ⋅ Interfaces
fbi
h_da
•
Die Hibernate SessionFactory und die Hibernate Session sind Beispiele für
Hibernate Interfaces, die mit der Implementierung der JPA-Spezifikationen
Wrapperklassen erhielten, um sie den im JPA-Standard definierten Interfaces
anzupassen:
•
EntityManagerFactory
Wrapperklasse für Hibernate SessionFactory:
– hält in ihrem Cache Mappingdaten und die generierten SQL Statements
– kann für die Anwendung EntityManager- (resp. Session-)Instanzen erzeugen
•
EntityManager
Wrapperklasse für Hibernate Session:
– kapseln Datenbankverbindungen und verwalten Transaktionen
– enthält First-Level-Cache und stellt automatisch Objektänderungen fest
– ist nicht(!) Thread-sicher, d.h. die Entities eines EntityManagers (resp. einer
Session) dürfen nur in dem Thread dieser Session verwendet werden.
Schestag
Datenbanken (Cnam)
Kapitel 8 - 52
fbi
h_da
Zusammenfassung
•
Die Konflikte, die durch die Verwendung einer objekt-orientierten
Applikationsschicht auf der Basis einer relationalen Persisenzschicht
entstehen können bezeichnet man als Impedance Mismatch
•
Objekt-relationales Mapping kann
– von einem objekt-orientierten Klassendiagramm ausgehend – Top
Down – oder
– von einem relationalen Datenbankschema ausgehend – Bottom Up –
realisiert werden
•
EJB 3.0 und die Java Persistence API (JPA) stellen eine Spezifikation für
OR-Mapping dar.
•
Das Zusammenspiel von EntityManagerFactory, EntityManager und
Persistenzkontext sowie die Beschreibung der PersistenceUnit in
persistence.xml wurden vorgestellt.
Schestag
Datenbanken (Cnam)
Kapitel 8 - 53
Datenbanken
9
Einführung
9
Semantische Datenmodellierung
9
Relationenmodell
9
Interne Datenorganisation
9
SQL - Structured Query Language
9
Datenbank-Anwendungsentwicklung
9
Transaktionsmanagement
9
Objekt-relationales Mapping
•
Rückblicke und Ausblicke
Schestag
Datenbanken (Cnam)
fbi
h_da
Kapitel 8 - 54
fbi
h_da
Datenbanken: Rückblicke und Ausblicke
→
Aufbauend auf dem Grundlagenkurs Datenbanken (Vorlesung und
Praktikum) des Anfangszyklus werden die folgenden Kurse zur
Vertiefung im Bachelor- und Masterzyklus angeboten:
VertiefungsZyklus (Master)
VorbereitungsZyklus (Bachelor)
Pflichtkurse
Anfangszyklus
Engineering von DSS ⋅
Data Warehouse NFE211
Engineering von DSS ⋅
Data- / Textmining NFE212
Datenanalyse ⋅ deskriptive
Methoden STA101
Konzeption u. Administration
von Datenbanken NFE113
NSY104 bzw. NFP121+50% NSY115
Datenbanken (V+P)
Projekt Systementwicklung
NFA008 und NFA011
NFA019
Projekt Systementwicklung
Programmieren (Java)
NFA002, NFA003, NFA005
Schestag
Datenbanken (Cnam)
Kapitel 8 - 55
Herunterladen