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