fbi h_da Datenbanken Kapitel 8: Objekt-relationales Mapping - eine Einführung - Schestag Datenbanken (Cnam) Kapitel 8-1

Ähnliche Dokumente
Datenzugriffskomponente mit JPA 2.1

Datenbankpraktikum, Gruppe F. JPA mit Hibernate. Alexander Stautner, Harald Zauner, Sascha Schreier

Java Persistence API. Phillip Ghadir Oliver Tigges

Datenbanken 2. Peter Muth Inge Schestag Uta Störl. Hochschule Darmstadt Fachbereich Informatik. Sommersemester 2017

Inhaltsverzeichnis. Bernd Müller, Harald Wehr. Java Persistence API 2. Hibernate, EclipseLink, OpenJPA und Erweiterungen ISBN:

Eclipse und EclipseLink

Persistenz. Ralf Gitzel

Enterprise JavaBeans Überblick

Übungsaufgabe Transaktion als Middleware

Softwareentwicklung mit Enterprise JAVA Beans

JPA mit Hibernate Java Persistence API in der Praxis

Java Persistence API mit Hibernate

OO Programmiersprache vs relationales Model. DBIS/Dr. Karsten Tolle

Kapitel 14. Objekt-relationales Mapping (ORM) mit Hibernate bzw. Java Persistance API (JPA) Prof. Dr. Wolfgang Weber Vorlesung Datenbanken

Relationales Datenbankpraktikum

Übungsaufgaben zur Klausurvorbereitung Datenbanken 2, SoSe 2016

OR-Mapping. WS2008/2009 DBIS/Dr. Karsten Tolle

Datenbanken 2. Kapitel 2: Java Persistence API

Übung B. JPA Java Persistence API. Prof. Dr. Andreas Schmietendorf 1. Übung B (Exkurs)

Workshop Java Webentwicklung Einführung in Hibernate. Ulrich Stärk

Java-Persistence-API mit Hibernate

Gregor Raschke 2008 HIBERNATE. Eine Einführung

Das diesem Dokument zugrundeliegende Vorhaben wurde mit Mitteln des Bundesministeriums für Bildung und Forschung unter dem Förderkennzeichen

Analyse und praktischer Vergleich von neuen Access- Layer-Technologien in modernen Webanwendungen unter Java. Oliver Kalz

Objektorientierte Datenbanken

Persistenz von Objekten relationale Datenbank Eigene Datenstruktur XML (JAXB) Proprietäre Dateiformate (Lochkarten)

Enterprise JavaBeans (mit JBoss)

Java-Persistenz-Architekturen. Freiberuflicher Entwickler und Autor. DOAG Konferenz 1.12.

Enterprise JavaBeans Überblick


Persistenz. Ralf Gitzel

Java Database Connectivity (JDBC) zum Zugriff aus in z.b. in Java geschriebenen Applikationen

Java Persistence API 2.x. crud + relationships + jp-ql

EJB 3 - Ein Blick über den Tellerrand. Heiko W. Rupp <hwr@pilhuhn.de>

Logischer Entwurf. Stufen der Entwicklung einer Datenbank. Inhalt. Übersicht. 1. Datenbank - Entwurf ( ER - Diagramm)

Objektorientierte Datenbanken

Programmieren II. Martin Schultheiß. Hochschule Darmstadt Sommersemester 2011

4.2 Workshop EJB. Entwicklung von EJB-Anwendungen

Rene Böing, Alexander Kuhn, Marc Wilmes Einführung in Spring und Hibernate

Die Java Persistence API

Technische Fachhochschule Berlin, FB VI - Medieninformatik Software Engineering (SE II), 2. Kapitel: Wir bauen uns eine Web-Applikation.

Enterprise JavaBeans Überblick

Hibernate. Vortragender : Nabil Janah Kursleiter : Prof. Dr. Björn Dreher Lehrveranstaltung : Komponenten-Architekturen. Nabil janah 1 Hibernate

Enterprise JavaBeans Überblick

Spring & Hibernate HANSER. Eine praxisbezogene Einführung. Richard Oates Thomas Langer Stefan Wille Torsten Lueckow Gerald Bachlmayr

Persistenz. Ralf Gitzel

Hibernate Eine Einführung

Richard Oates Thomas Langer Stefan Wille Torsten Lueckow Gerald Bachlmayr. Spring & Hibernate. Eine praxisbezogene Einführung HANSER

Datenbanken 1 Datenbanken SPO 2014 SPO 2007 Belegnummer Belegnummer

ADF Persistenzmechanismen

Behandelt Java EE 6. O Reillys Taschenbibliothek. Java EE. kurz & gut. Arun Gupta O REILLY. Übersetzung von Thomas Demmig

Literatur. 3. Java Persistence API ( JPA)

Session Beans & Servlet Integration. Ralf Gitzel

Spring & Hibernate Eine praxisbezogene Einführung

Probleme bei der Nutzung der Bean Validation in JPA

5.2 Workshop EJB. Entwicklung von EJB-Anwendungen. Das JOnAS-System

Enterprise JavaBeans Überblick: 8. Test-Driven Development. 8.1 Einleitung 8.2 Beispiel 8.3 Anwendung mit Eclipse und dem JBoss Application Server

Datenbanken 2. Kapitel 2: Java Persistence API

Datenbanken 2. Kapitel 4: Transaktionsmanagement, Caching und Ladestrategien

O/R Mapper. O/R Mapper anhand von NHibernate & Entity Framework Thomas Mentzel März 2010

Objektrelationales Mapping mit EclipseLink und Spring. Stefan Scheidt OPITZ CONSULTING GmbH

Datenbanken Datenbanken 1 Belegnummer Belegnummer

Hibernate Das Praxisbuch für Entwickler

Enterprise JavaBeans Überblick: 10. Queries Interface Query 10.2 EJB Query Language 10.3 Named Queries

Wiederholung. Systemtests

EJB 3.0 alles wird einfacher. Stephan Metzler, eurolink SWITZERLAND

Application Development Framework (ADF) Teil 3: Standardisierte Persistenzmechanismen in Verbindung mit ADF

Referent: Marko Modsching. Vortrag: JPA mit Hibernate. Datum: Deutsche Software Engineering & Research GmbH

JDO Java Data Objects

Polyglot Persistence und NoSQL

Objektorientierte Datenbanken

5. Übung zu Software Engineering

Unsere Webapplikation erweitern

FWP Aktuelle Technologien zur Entwicklung verteilter Java-Anwendungen

EJB 3 - Erfahrungen aus der Praxis. Heiko W. Rupp

Inhaltsverzeichnis Einleitung Imperative Sprachkonzepte Objektorientierte Sprachkonzepte

Projektgruppe. Thomas Kühne. Komponentenbasiertes Software Engineering mit OSGi

Algorithmen und Datenstrukturen 06

Enterprise JavaBeans Überblick

Java Persistence Puzzlers

Datenbanken 2. Kapitel 5: Pufferverwaltung und Optimierung von Zugriffspfaden

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Gerüstbeispiel. Vererbungshierarchie: Typ 0

Datenbanken Objektrelationales Mapping Spezifikation

Vesant JDO Genie für transparente Persistenz mit relationalen Datenbanken.

MyCoRe > V1.0: Technische Weiterentwicklung

Konzeptueller Entwurf

Persistenz unter Kontrolle mit JDBI für Java

FWP Aktuelle Technologien zur Entwicklung verteilter Java- Anwendungen

Kardinalitäten. Komponentenbasierte Software- Entwicklung. Prof. Dr. Stephan Kleuker

Kardinalitäten. Umsetzung unidirektional 1 : N ( 3 / 4 )

Arbeitsblätter zu Teil I des Praktikums

Vererbung, Polymorphie

Kein blasses Schema? NoSQL und Big Data mit Hibernate OGM

Transkript:

Datenbanken Kapitel 8: Objekt-relationales Mapping - eine Einführung - Schestag Datenbanken (Cnam) Kapitel 8-1

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 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 Objektmodell oo Klassendiagramm Objekte Collections OIDs Vererbung?? Wer mappt wie? Welches ist das führende System? Relationale Datenbank Relationenmodell Relationen elementare Datentypen PK-Constraints FK-Constraints Schestag Datenbanken (Cnam) Kapitel 8-4

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 oder Knr Kunde Kunde.Knr = Adresse.Knr Adresse Knr lfdnr Adr_Strasse Adr_Land Adr_PLZ Adr_Ort Schestag Datenbanken (Cnam) Kapitel 8-5

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 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/R- Diagramm modelliert wurde? Person IS-A Kunde Mitarbeiter Schestag Datenbanken (Cnam) Kapitel 8-7

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

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 int bposten_id <<association impl.>> Bestellung bestellung Artikel artikel Artikel int artikel_id <<association impl.>> Kategorie kategorie Collection bposten Bestellung int bestellung_id <<association impl.>> Benutzer benutzer Collection bposten Benutzer int benutzer_id benutzer_name <<association impl.>> Gruppe gruppe Collection bestellungen -- 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(); Kategorie int kategorie_id <<association impl.>> Collection artikel Gruppe int gruppe_id <<association impl.>> Collection benutzer Welche Instanzen werden werden bei bei dieser dieser Query Query geladen? Schestag Datenbanken (Cnam) Kapitel 8-10

Impedance Mismatch - Graphennavigation 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 bp1:bestellungsposten a1:artikel k1:benutzer bp2:bestellungsposten bp3:bestellungsposten a2:artikel a3:artikel k1:kategorie b2:bestellung bp4:bestellungsposten k2:kategorie bp5:bestellungsposten a4:artikel k2:benutzer k3:benutzer g1:gruppe g2:gruppe b3:bestellung und auch diese haben wiederum assoziierte Objekte. Schestag Datenbanken (Cnam) Kapitel 8-11

Objekt-relationales Mapping 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

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

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 UML-Editor CASE-Tool getrieben Java de.hda.webshop.entity.jpa + - EntityX.java + - EntityY.java + - EntitiyZ.java + - oder direkt durch Codierung in der Entity-Klasse Java de.hda.webshop.entity.jpa + - EntityX.java + - EntityY.java + - EntitiyZ.java + - OR-Mapper OR-Mapper DB DB Bottom-Up Top-Down Schestag Datenbanken (Cnam) Kapitel 8-15

Objekt-relationales Mapping 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-16

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 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 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 TopLinkEssentials 1, EclipseLink 2, Apache OpenJPA, Bea Kodo, 1) Referenzimplementierung für JPA 1.0 2) Referenzimplementierung für JPA 2.0 Schestag Datenbanken (Cnam) Kapitel 8-19

Objekt-relationales Mapping 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-20

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) 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

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

Objekt-relationales Mapping 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-24

JPA Beziehungen 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 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 Bestellung - Kunde kunde; @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. @Entity public class Bestellung { @ManyToOne private Kunde kunde; public Kunde getkunde() { return kunde; } } Schestag Datenbanken (Cnam) Kapitel 8-26

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 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) Wie werden n:m-beziehungen im Relationenmodell umgesetzt? Student 1..* Vorlesung 1..* Unidirektionale Variante: @Entity public class Student { } } @Entity public class Vorlesung { @ManyToMany private Collection<Student> studenten = new HashSet(); public Collection<Student> getstudenten() { return studenten; } } Schestag Datenbanken (Cnam) Kapitel 8-29

JPA n:m-beziehungen (2) Bidirektionale Variante: Student 1..* referenzierte Seite 1..* Besitzer Vorlesung 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; } } @Entity public class Vorlesung { @ManyToMany private Collection<Student> studenten = new HashSet(); public Collection<Student> getstudenten() { return studenten; } } Schestag Datenbanken (Cnam) Kapitel 8-30

JPA n:m-beziehungen (3) Ergebnis in der Datenbank Student id name id = studenten_id Vorlesung_Student vorlesungen_id studenten_id vorlesungen_id = id Vorlesung 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(); } Belegung v_id s_id Schestag Datenbanken (Cnam) Kapitel 8-31

JPA n:m-beziehungen (4) ACHTUNG: Verwendet man in der Anwendung die JPA-API und Hibernate als JPA-Persistence-Provider werden die Primärschlüssel in der Join- Tabelle 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

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 1..* id note Note 1..* 1..1 Vorlesung @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

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

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

Objekt-relationales Mapping 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-36

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

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

JPA Entity-Manager-Factory Entity Manager-Instanzen werden von der Instanz einer Entity Manager- Factory 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 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

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 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

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 EntityManagerFactory * * * 1 DB-Schema Entity-Klassen EntityManager arbeitet mit Instanzen von Entity-Klassen im jeweiligen Persistenz-Kontext Schestag Datenbanken (Cnam) Kapitel 8-43

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

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.find(); em..commit(); Persistenzkontext von em 123 Schmitt Schmidt Persistenzkontext von em 123 Schmidt kunde1.setname(); NULL Meyer em.persist(kunde2); 124 Meyer Kunde kunde2 = new Kunde(); Schestag Datenbanken (Cnam) Kapitel 8-45

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 Managed Removed Schestag Datenbanken (Cnam) Kapitel 8-46

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

Objekt-relationales Mapping 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-48

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 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 Persistente Objekte Objekte Hibernate Hibernate persistence.xml persistence.xml hibernate.cfg.xml hibernate.cfg.xml hibernate.properties hibernate.properties Mapping Mapping Annotations Annotations / / XML XML Enthält die Beschreibungen aller PersistenceUnits (PU) des aktuellen Projektes (s.u.) Datenbank Datenbank Schestag Datenbanken (Cnam) Kapitel 8-50

Exkurs Hibernate-Architektur 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: Wrapperklasse EntityManager Factory Transiente Transiente Objekte Objekte SessionFactory SessionFactory Transaction Transaction Factory Factory Anwendung Anwendung Connection Connection Provider Provider Persistente Persistente Objekte Objekte Session Session Transaction Transaction Wrapperklasse EntityManager JNDI JNDI JDBC JDBC JTA JTA Datenbank Datenbank Schestag Datenbanken (Cnam) Kapitel 8-51

Exkurs Hibernate-Architektur Interfaces 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

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 Einführung Semantische Datenmodellierung Relationenmodell Interne Datenorganisation SQL - Structured Query Language Datenbank-Anwendungsentwicklung Transaktionsmanagement Objekt-relationales Mapping Rückblicke und Ausblicke Schestag Datenbanken (Cnam) Kapitel 8-54

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: Vertiefungs- Zyklus (Master) Engineering von DSS Data Warehouse NFE211 Engineering von DSS Data- / Textmining NFE212 Vorbereitungs- Zyklus (Bachelor) Konzeption u. Administration von Datenbanken NFE113 Datenanalyse deskriptive Methoden STA101 Projekt Systementwicklung NSY104 bzw. NFP121+50% NSY115 Pflichtkurse Anfangszyklus Datenbanken (V+P) NFA008 und NFA011 Programmieren (Java) NFA002, NFA003, NFA005 Projekt Systementwicklung NFA019 Schestag Datenbanken (Cnam) Kapitel 8-55