AutomatisiertePersistenz: Persistenz-Frameworks



Ähnliche Dokumente
Datenzugriffskomponente mit JPA 2.1

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

Datenmanagement in Android-Apps. 16. Mai 2013

Übungsaufgabe Transaktion als Middleware

AutomatisiertePersistenz: Persistenz-Frameworks

Session Beans & Servlet Integration. Ralf Gitzel ralf_gitzel@hotmail.de

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

EJB Beispiel. JEE Vorlesung 10. Ralf Gitzel

Programmieren in Java

mywms Vorlage Seite 1/5 mywms Datenhaltung von Haug Bürger

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

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

mysql - Clients MySQL - Abfragen eine serverbasierenden Datenbank

Ein Ausflug zu ACCESS

Softwareentwicklung mit Enterprise JAVA Beans

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Kapitel 4 Die Datenbank Kuchenbestellung Seite 1

Anleitung zur Installation und Verwendung von eclipseuml 2.1.0

7. Übung - Datenbanken

Dokumentation zum Spielserver der Software Challenge

Suche schlecht beschriftete Bilder mit Eigenen Abfragen

MORE Profile. Pass- und Lizenzverwaltungssystem. Stand: MORE Projects GmbH

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 16: 3-Schichten-Architektur 1 Fachkonzept - GUI

Objektorientierte Programmierung

Von der Technik zum Entwurf. Prinzipien des Entwurfs Kapselung der Persistenz Referenzarchitektur Web-Anwendungen Schichtentrennung

Mengenvergleiche: Alle Konten außer das, mit dem größten Saldo.

Handbuch ECDL 2003 Basic Modul 5: Datenbank Grundlagen von relationalen Datenbanken

Einführung in die Java- Programmierung

JSP Grundlagen. JEE Vorlesung Teil 5. Ralf Gitzel

Java Persistence API. Phillip Ghadir Oliver Tigges

DATENBANKEN SQL UND SQLITE VON MELANIE SCHLIEBENER

Programmieren für mobile Endgeräte SS 2013/2014. Dozenten: Patrick Förster, Michael Hasseler

Arbeiten mit UMLed und Delphi

Leichte-Sprache-Bilder

WebService in Java SE und EE

How-to: Webserver NAT. Securepoint Security System Version 2007nx

Übungen zum Workshop Objektrelationales Mapping mit JPA 2.0

HINWEISE ZUR ARBEIT IM LABOR

teamsync Kurzanleitung

Updatehinweise für die Version forma 5.5.5

In diesem Thema lernen wir die Grundlagen der Datenbanken kennen und werden diese lernen einzusetzen. Access. Die Grundlagen der Datenbanken.

Hibernate Das Praxisbuch für Entwickler

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

Speicher in der Cloud

Synchronisations- Assistent

Java: Vererbung. Teil 3: super()

Prinzipien Objektorientierter Programmierung

Software Engineering Klassendiagramme Assoziationen

Übungen zur Softwaretechnik

Anleitung zur Einrichtung einer ODBC Verbindung zu den Übungsdatenbanken

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

OP-LOG

Dynamisches SQL. Folien zum Datenbankpraktikum Wintersemester 2009/10 LMU München

PHP Kurs Online Kurs Analysten Programmierer Web PHP

Klausur zur Einführung in die objektorientierte Programmierung mit Java

Informatik 12 Datenbanken SQL-Einführung

Übungen zu Softwaretechnik

Urlaubsregel in David

Musterlösung zur Vorlesung Modellbasierte Softwareentwicklung Wintersemester 2014/2015 Übungsblatt 9

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 17: 3-Schichten-Architektur 2

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

KURZANLEITUNG CLOUD OBJECT STORAGE

Virtueller Seminarordner Anleitung für die Dozentinnen und Dozenten

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala

Software Engineering. Zur Architektur der Applikation Data Repository. Franz-Josef Elmer, Universität Basel, HS 2015

4. BEZIEHUNGEN ZWISCHEN TABELLEN

Objektorientierte Programmierung. Kapitel 12: Interfaces

Einbindung einer ACT!12-16 Datenbank als Datenquelle für den Bulkmailer 2012

EinfÅhrung in die objektorientiere Programmierung (OOP) unter Delphi 6.0. EDV Kurs 13/2

Java Einführung Umsetzung von Beziehungen zwischen Klassen. Kapitel 7

Erstellung botoptimierter Partnerlinks

LDAP Konfiguration nach einem Update auf Version 6.3 Version 1.2 Stand: 23. Januar 2012 Copyright MATESO GmbH

Klassendiagramm. Kurzer Überblick über UML - Stand BlaBla

Fachhochschule Deggendorf Platzziffer:...

Java Enterprise Architekturen Willkommen in der Realität

Serienbrieferstellung in Word mit Kunden-Datenimport aus Excel

XINDICE. The Apache XML Project Name: J acqueline Langhorst blackyuriko@hotmail.de

Eigene Seiten erstellen

BüroWARE Exchange Synchronisation Grundlagen und Voraussetzungen

ecaros2 - Accountmanager

Lizenzen auschecken. Was ist zu tun?

Folgende Einstellungen sind notwendig, damit die Kommunikation zwischen Server und Client funktioniert:

INSTALLATIONSANLEITUNG

Enterprise JavaBeans Überblick

Factory Method (Virtual Constructor)

Professionelle Seminare im Bereich MS-Office

Software Engineering Interaktionsdiagramme

IMAP Backup. Das Programm zum Sichern, Synchronisieren, Rücksichern und ansehen von gesicherten Mails. Hersteller: malu-soft

Anwendungshinweis Nr. 12. Wie konfiguriere ich redundante Serververbindungen

Klausur WS 2006/07 Programmiersprache Java Objektorientierte Programmierung II 15. März 2007

Autorisierung. Sicherheit und Zugriffskontrolle & Erstellen einer Berechtigungskomponente

Effiziente Administration Ihrer Netzwerkumgebung

Einrichten einer Festplatte mit FDISK unter Windows 95/98/98SE/Me

SJ OFFICE - Update 3.0

Step by Step Webserver unter Windows Server von Christian Bartl

Institut für Programmierung und Reaktive Systeme 25. August Programmier-Labor Übungsblatt. int binarysearch(int[] a, int x),

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

Merchant Center und Adwords Produkterweiterung mit Filter

Transkript:

AutomatisiertePersistenz: Persistenz-Frameworks

Was ist Persistenz? Persistenz bedeutet, dass die Objekte die Programmausführung überdauern Praktisch: Objekte werden in einer Datenbank "aufbewahrt" Auch Dateisystem möglich Nicht: Die Objekte holen sich Ihre Infos aus einer Datenbank, Sondern: Die Objekte werde aus der Datenbank geholt 3-Schichten-Architektur: Datenhaltungsschicht muss alle relevanten Objekte dauerhaft abspeichern so dass sie das Programmende überleben Außerdem können bei großen Anwendungen nicht alle Objekte speicherresident sein Zwischenspeicherung in der DB. (c) schmiedecke 08 SE2-4-Persistenzmodelle 2

OR-Mapping Abbildung vom Klassenmodell auf das Relationale Datenmodell. Systematische Zuordnung (OR-Mapping) Bis auf Vererbung identisch mit der Abbildung ERM Relationales Modell Klasse Tabelle oder Tabellengruppe Beziehung Fremdschlüssel und ggf. Verknüpfungstabelle Vererbung Tabelle oder Tabellengruppe Damit kann das Relationale Schema für die Persistenz automatisch erzeugt werden. (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 3

Direkte Datenbank-Anbindung per JDBC class ERM online shop Produk t - Produktnummer: int - Preis: double - Name: String - Info: String - AnzKolli: int - Gewicht: double * * * Kunde Einkaufswagen - Name: String - Datum: Date 1 1 - Strasse: String - Ort: String - PLZ: int JDBC 1 * Orde r - Bestelldatum: Date - Lieferdatum: Date - Versandform: String - Rechnungsnummer: int - Bearbeiter: String 1 1..* * * 1 Kreditk arte - Kartentyp: String - Kartennummer: int - Gültigkeit: Date Beziehung zwischen Klassen und Tabellen nicht erkennbar Regeln für den "Zusammenbau" von Objekten aus DB-Daten müssen explizit programmiert werden SQL-Verwendung: Datenbank enthält Daten, nicht Objekte, d.h. es kann nicht direkt nach Objekten gesucht werden (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 4

ORM class ERM online shop Produk t - Produktnummer: int - Preis: double - Name: String - Info: String - AnzKolli: int - Gewicht: double * * Einkaufswagen - Datum: Date * 1 1 Kunde - Name: String - Strasse: String - Ort: String - PLZ: int ORM 1 * Orde r - Bestelldatum: Date - Lieferdatum: Date - Versandform: String - Rechnungsnummer: int - Bearbeiter: String 1 1..* * * 1 Kreditk arte - Kartentyp: String - Kartennummer: int - Gültigkeit: Date ORM liefert die Abbildung zwischen Klassen und Tabellen (- gruppen) Query Language ermöglicht Suche auf Objektebene Es gibt keine DML, sondern Objekte werden manipuliert und dann persistiert (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 5

OR-Mapping auf dem Weg zum Traum OR-Mapping Abbildungsschema zwischen Objektmodell und Datenmodell Entitytyp (~"Tablelle") und Klasse sind verwandte Konzepte Abbildung "einfacher Objekte", d.h. von Objekten, die keine weiteren Objekte enthalten / referieren, ist trivial: Klasse wird Tabelle Attribute werden Tabellenattribute Komplexe Objekte und Objektbeziehungen erfordern komplexere Abbildung (c) schmiedecke 08 SE2-4-Persistenzmodelle 6

ORM mit JPA JPA = Java Persistence API Bestandteil von EJB 3 aber auch in JSA nutzbar. Bei Ausführung* wird das DB- Schema erzeugt Kennzeichnung der zu persistierenden Klassen durch Annotation @Entity *) Ausführung eines DB-Zugriffs Kennzeichnung der Beziehungen durch Annotationen @OneToMany, @OneToOne, @ManyToOne, @ManyToMany Kennzeichnung der Vererbungs-Strategie durch Annotationen @Inheritance(strategy= ) Spezifikation des DB-Zugangs in einer PersistenceUnit (persistence.xml) (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 7

Beispiel-Modell von ArgoUML generierter Code: public class Student extends Unimitglied { } public int matrikelnummer; public int semester; /** * * @element-type Dozent */ public Vector mydozent; public Dozent mydozent; (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 8

Von der Klasse zur Entity von ArgoUML generierter Code: komplettierter und annotierter Code: public class Student extends Unimitglied { } public int matrikelnummer; public int semester; /** * * @element-type Dozent */ public Vector mydozent; public Dozent mydozent; @Entity public class Student extends Unimitglied { @Id Integer id; int matrikelnummer; int semester; @ManyToMany Collection<Dozent> mydozent; @ManyToOne Dozent mytutor; public Integer getid() { } public int getmatrikelnummer() { } publíc void setid(integer id) { } public void setmatrikelnummer( ){ } (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 9 }

Automatisch erzeugtes DB-Schema Das Schema hängt von der gewählten Vererbungs-Strategie ab! (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 10

Entity-Annotation @Entity @Table(name="T_Student") public class Student extend Unimitglied{ @Id @GeneratedValue int id; public int getid() { return id; } public void setid(int id) { this.id=id; } } @Entity deklariert eine Klasse als persistent. Die Angabe des Tabellennamens ist optional standardmäßig wird der Klassenname verwendet. Alle Attribute müssen als Properties gekapselt werden. Es muss eine numerische @Id Property eingefügt werden, am besten mit generierten Werten. (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 11

Vererbungs-Annotation @Entity @Table(name="T_Mitglied") @Inheritance(Strategy=Inheritance.JOINED public class Unimitglied {.} Die Vererbungs-Strategie wird bei der Basisklasse annotiert Standard ist SINGLE_TABLE JOINED entspricht Einzeltabellen für alle Klassen der Hierarchie Die Strategie TABLE_PER_CLASS (Tabelle je konkrete Klasse) muss nicht auf allen Servern implementiert sein (Testen Sie Glassfish daraufhin) (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 12

ORM: Attributspezifikation per Annotation @Basic Basisdatentyp @LOB BLOB oder CLOB nach Bedarf @Temporal Zeitwert @Embedded eigebettetes Objekt (strukturiertes Objekt mit 1:1-Beziehung) (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 13

Assoziations-Annotation @ManyToMany private Collection<Dozent> mydozent; @ManyToOne private Dozent mytutor; @ManyToMany(mappedBy = "mydozent") private Collection<Student> mystudent; Annotation entweder immer der Attribute oder immer der Getter. Annotation entsprechend den Kardinalitäten. bei @XToMany sollte der Typ eine generische Collection sein (oder eine Unterklasse von Collection). Ersatzweise kann der Elementtyp als Attribut targetentity="dozent" angegeben werden. Bei bidirektionalen Assoziationen muss auf der zweiten Seite in einer mappedby-angabe der Name des bezugnehmenden Attributs der ersten Seite angegeben werden. Bei @OneToOne kann das Attribut optional=false gesetzt werden (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 14

Kurzanleitung zum "Zaubern" (CRUD) 1. JSF-Projekt anlegen 2. Im SourcePackages-Verzeichnis ein Paket mit annotierten Entity- Klassen erzeugen. 3. Eine PersistenceUnit anlegen (Netbeans fordert sie dazu auf wählen sie am besten eine leere DB) 4. Im Kontextmenü des Projekts New >> JSF Pages from Entity Classes wählen und die gewünschten Klassen selektieren 5. warten 6. Projekt ausführen. Wenn sie mögen, tragen Sie Werte ein. 7. DB ansehen / bestaunen. (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 15

(c) schmiedecke 12 SE2-6-Persistenz-Frameworks 16

ORM ist noch nicht Persistenz OR-Mapping: Wie werden Objekte auf Datenbanktupel abgebildet? Genauer: Wie wird das Klassenmodell auf das Datenbankschema abgebildet? DB-Connection: Wie baut man die Verbindung zur richtigen Datenbank auf? Objekt-Materialisierung, -Dematerialisierung und -Suche Wie werden aus Tupeln Objekte gebaut? Und welche referierten Tupel werden mit geladen? Und wie findet man die Objekte in der Datenbank? Objekt-Caching und -Synchronisation: Wie werden Speicherobjekte und Datenbank synchron gehalten? (c) schmiedecke 08 SE2-4-Persistenzmodelle 17

Persistenz mit JPA Java Persistence API Persistenzmodell der EJB 3.0-Spezifikation mehrere Implementierungen (Hibernate JPA, toplink, ) Auf jedem JEE-Server vorhanden Aber seit EJB 3.0 auch für POJOS (=Plain Old Java Objects), d.h. ausgelagert aus JEE. Jede Java-Klasse kann "Persistent Entity" sein wenn sie "will" Java-5-Annotationen spezifizieren Persistenz ORM Umgang mit Abhängigkeiten Ladeverhalten soweit waren wir schon (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 18

Ein paar Vokabeln vorweg Persistence Provider - die JPA-Implementierung Persistence Unit - Realisierung einer DB-Anbindung - konfiguriert in der persistence.xml Persistence Context - die Speicherobjekte (der Cache) Entity-Manager - verwendet die Persistence Unit - realisiert (De-)Materialisierung - setzt die Objektsuche um - verwaltet den Cache (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 19

Entity-Manager Applikation find query Entity Manager Detached objects persist remove Persistenz-Kontext flush merge refresh DB (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 20

Wie erhält man den EntityManager: J2SE Referenz auf EntityManager kann durch eine Factory erzeugt werden. Der zugehörige Persistenz-Kontext gilt für die Lebensdauer des EntityManagers (Extendend) private EntityManager entitymanager = EntityManagerFactory.createEntityManager() JEE Ein Persistenz-Kontext gilt (per default) für eine Transaktion. Referenz auf Entity-Manager wird "injiziert" (Dependency injection), d.h. von der Umgebung (automatisch) gesetzt: @PersistenceContext private EntityManager entitymanager; (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 21

Arbeiten im Persistenz-Kontext CLIENT-Operation: JPA-Umsetzung Dozent dozent1 = jpahelper.create(); Dozent obj = new Dozent(); entitymanager.persist(obj); return obj; dozent.setname("schmiedecke"); jpahelper.update(dozent); entitymanager.merge(dozent); //Objekt aktualisieren jpahelper.refresh(dozent); entitymanager.refresh(dozent); jpahelper.detach(dozent); entitymangager.remove(dozent); jpahelper.refresh(dozent); entitymanager.refresh(???); // detached, also unbekannt Dozent d2 = jpahelper.findbyname("sauer"); Query query = entitymanager.createquery (c) schmiedecke 12 ("SELECT d FROM dozent WHERE s.name="sauer"); SE2-6-7-Architekturübersicht return (Dozent) (query.getresultlist().getrow(0)); 22

Objektsuche: Queries in JPA EntityManager ermöglicht das Erstellen und Ausführen von Queries Statische "NamedQueries", als Entity-Annotationen definiert Dynamisch erzeugte Queries Flush-Modus: Vor jeder Query wird der Persistenz-Kontext synchronisiert SQL-Abfragen sog. "Native Queries" werden als Strings an die DB weitergerichteher weniger sinnvoll, da das DB-Schema eigentlich verborgen ist JPQL die Abfragesprache von JPA Selektionsabfragen Nachbildung der SQL auf Objektebene Weitergabe dennoch als Strings Aktualisierungs- und Löschanweisungen (Nur selten sinnvoll, etwa Massenaktualisierungen; sollte besser auf der Ebene der Geschäftsobjekte erfolgen) Criteria API programmatische Abfragen auf Objektebene in Java (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 23

JPQL Grundsyntax der SELECT-Klauseln wie SQL: SELECT, WHERE, AND, OR, ORDER BY etc die üblichen arithmetischen, logischen und Vergleichsoperationen die Variablen sind Pfadausdrücke im Klassenschema können über Klassengrenzen führen "SELECT s.mytutor.fb FROM Student s" Parametrisierung nummerierte Parameter?0,?1,?2 Namensparameter :name, :vorname, :matrikel Setzen durch setparameter() auf einer Query Query q = em.createquery("select WHERE s =?0"); q.setparameter(0, 1234); List<String> liste = q.getresultlist(); (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 24

Named Queries Vor der @Entity-Annotation kann eine Liste von benannten Abfragen stehen, die sich auf dieklasse beziehen. JPQL- oder "native" (SQL) Abfragen @NamedQuery(name="alleStudenten", query="select s FROM Student s") @NamedNativeQuery(name="AlleStudentenNativ", query="select * FROM STUDENT") @Entity public class Student extends Unimitglied { } Verwendung mit createnamedquery: List<Student> liste = em.createnamedquery("allestudentennativ").getresultlist(); (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 25

Der Java-Weg: Criteria-Query Queries werden als Java-Objekte "gebaut" Typsicher und Injection-sicher Idee ähnlich JDBC: CriteriaQuery-Objekt gehört zu einem EntityManager der CriteriaQuery werden schrittweise die Kriterien hinzugefügt die CriteriaQuery wird "abgeschickt" und liefert eine ResultList oder ein SingleResult (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 26

Aufbau einer CriteriaQuery public List<Student> findall() { } EntityManager em = getentitymanager(); CriteriaQuery cq = em.getcriteriabuilder().createquery(); cq.select(cq.from(student.class)); Query q = em.createquery(cq); return q.getresultlist(); (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 27

Aufbau einer CriteriaQuery SingleResult public Long count() { } EntityManager em = getentitymanager(); CriteriaQuery cq = em.getcriteriabuilder().createquery(); Root<Student> rt = cq.from(student.class); cq.select(em.getcriteriabuilder().count(rt)); Query q = em.createquery(cq); return ((Long)q.getSingleResult()).intValue(); (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 28

Klauseln einer CriteriaQuery Quelle: http://www.ibm.com/developerworks/java/library/j-typesafejpa/ (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 29

Transaktionen Zurückschreiben in die DB Es gibt viele Möglichkeiten in JPA, Transaktionen explizit oder implizit zu nutzen. Hier nur die einfachsten und gebräuchlichsten, JSE Schließen des EntityManagers (em.close()) beendet den PersistenceContext und damit die aktuelle Transaktion JEE Wenn der EntityManager injiziert wurde, stellt automatisch der Aufruf einer Bean-Methode eine Transaktion dar. (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 30

Transaktionen hinter den Kulissen - der Objekte-Cache Sammelbecken für materialisierte Objekte Dematerialiserung bei Transaktionsende Speicherbedarf expliziter Speicherung oder Synchronisation Transaktionszustände der Cache-Objekte Es gibt materialisierte und neu erzeugte Objekte Objekte können im Cache verändert oder gelöscht werden 6 Transaktionszustände: new clean, old clean new dirty, old dirty new deleted, old deleted pro Transaktionszustand ein Cachebereich (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 31

Dematerialisierung bedeutet Synchronisation new clean old clean neu erzeugte (nicht materialisierte) Objekte, die nicht verändert wurden Objekt in die Datenbank einfügen (insert) old clean old clean alte materialisierte Objekte, die nicht verändert wurden keine Aktion notwendig new dirty old clean neu erzeugte (nicht materialisierte) Objekte, die verändert wurden Objekt in die Datenbank einfügen (insert) old dirty old clean alte materialisierte Objekte, die verändert wurden Objekt in der Datenbank aktualisieren (update) new deleted X neu erzeugte (nicht materialisierte) Objekte, die gelöscht wurden Objekt aus dem Cache löschen old deleted X alte materialisierte Objekte, die gelöscht wurden Objekt aus der Datenbank löschen (delete) (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 32

Synchronisation (bei Transaktionsende) new clean old clean new dirty old dirty new deleted old deleted Cache-Aktionen abhängig von Transaktionszuständen Zustände können automatisch verwaltet.werden. (c) schmiedecke 12 SE2-6-7-Architekturübersicht 33

Persistenzkonzepte behandelt OR-Mapping: Wie werden Objekte auf Datenbanktupel abgebildet? Genauer: Wie wird das Klassenmodell auf das Datenbankschema abgebildet? DB-Connection: Wie baut man die Verbindung zur richtigen Datenbank auf? Objekt-Materialisierung, -Dematerialisierung und -Suche Wie werden aus Tupeln Objekte gebaut? Und welche referierten Tupel werden mit geladen? Und wie findet man die Objekte in der Datenbank? Objekt-Caching und -Synchronisation: Wie werden Speicherobjekte und Datenbank synchron gehalten? (c) schmiedecke 08 SE2-4-Persistenzmodelle 34

Fazit: Persistenz ist machbar! saubere Strukturen klare Regeln aber mühsam! Persistenz-Frameworks nehmen uns die Arbeit ab! Persistenz ohne Programmierleistung Minimaler Konfigurationsaufwand Und ein leicht zu verstehendes Konzept (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 35

Der Traum: Transparente Persistenz Animation unter http://www.servicearchitecture.com/object-relationalmapping/articles/transparent_persi stence.html Abfolge Application will Person benutzen Cache ist leer Mapping holt Persontupel aus der DB Person wird im Cache aufgebaut Zugriffsversuch auf Adresse fehlt im Cache Bezug aus der DB Update Adresse Rückschreiben in die DB (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 36

Wer materialisiert die Objekte? Direkte und indirekte Persistenz Direkte Persistenz: jedes persistente Objekt enthält Methoden, um sich selbst zu materialisieren / dematerialisieren / synchronisieren. Wissen über den DB-Zugang und den entsprechenden Teil des Datenmodells sind in jeder Klasse vorhanden. DB-Zugang, Datenmodell und Persistenzstrategie schwer änderbar. Indirekte Persistenz den Fachobjekten sind Persistierungsobjekte sind zugeordnet Materialisierung / Dematerialisierung / Synchronisation erfolgt "von außen" als Service für die Fachobjekte. Voraussetzung für transparente Persistenz. (c) schmiedecke 08 SE2-4-Persistenzmodelle 37

Transparente Persistenz Ziel ist eine transparente Persistenz Die Anwendung soll mit Objekten arbeiten und möglichst wenig von der Persistenz merken Das bedeutet kapseln: Zugriffswissen kapseln DAO-Muster Zugriffs - und Klassenwissen trennen Broker-Muster (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 38

DAO Data Access Objects (Persistierungsobjekte) Annahme aus der Analysephase: Klasse verwaltet die Menge ihrer Objekte würde jetzt bedeuten, dass jede Klasse die DB-Details kennt nicht transparent DB-Wechsel sehr aufwändig Data Access Object der Objekte-Baumeister: Klassenspezifisches Zugriffsobjekt kapselt die DB-Details liefert und persistiert die Anwendungsobjekte Nachteile Für jede Klasse ein DAO Viel redundanter Code Viel Aufwand bei DB-Wechsel (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 39

Das Broker-Muster kennt und verwaltet den Objekt-Cache benutzt getobject(oid, class) Methode getobject(oid, class) ist abstract kennt die DB kann den passenden Objektbroker ermitteln Methode getobject(oid, class) ist Schablone, benutzt getobject(oid) Methode getobject(oid) ist abstract kennt und verwaltet den Objekt-Cache Methode getobject ist implementiert Der Klassenspezifische DAO-Anteil ist klein und DB-neutral: (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 40

Generische Lösung AbstractDAO <Type> getobject(int id):<type> StudentDAO getobject(int id):student ORM- Manager Einfachere Umsetzung mit generischen Klassen: Die Klasse AbstractDAO enthält getobject als generische Schablonenmethode Die Verbindungsinformation und der DB-Zugriff wird als separates Objekt eingebunden In der Konkretisierung wird der tatsächliche Typ eingesetzt (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 41

OR-Mapping Lazy Materialization Laden externer Objekte: Was ist mit den assoziierten Objekten? Objektstruktur kann stark verzweigen... Proxy-Entwurfsmuster: Objekt erreichbar über ein Stellvertreterobjekt (Proxy) Proxy liegt im Speicher besorgt das Nachladen des Objekts bei Bedarf enthält das OID (c) schmiedecke 08 SE2-4-Persistenzmodelle 42

Proxy-Entwurfsmuster Objektassoziation des Client verweist auf einen Platzhalter Proxy, imitiert Struktur des realen Subjekts. Anfrage (request) erzeugt Bedarf: Das reale Subjekt wird geladen und die Anfrage delegiert. (c) schmiedecke 08 SE2-4-Persistenzmodelle 43

DAO mit Proxy- und Broker-Muster class Slides Stundenplan Dozent + getadresse() : Adress DozentReal + getadresse() : Address DozentProxy + getadresse() : Address DbBroker + getobject(int) : Object DerbyBroker + getobject(int) : Object DozentDAO + getobject(int) : Object erst bei Bedarf wird Dozent als DozentReal mithilfe des DAO materialisiert der gesamte Persistenzapparat bleibt unter der Oberfläche. (c) schmiedecke 12 SE2-6-7-Architekturübersicht 44

Fazit Persistenz-Frameworks liefern den sicheren Umgang mit persistierten Objekten. Ziel: POJO-Architektur Die Schnittstelle zur Persistenz wird aus den Fachobjekten ausgelagert DAOs. Fachobjekte sind POJOS Alternativer Ansatz: "Active Record" Jedes Fachobjekt erweitert eine Persistierungsklasse. (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 45

Alternative OO-DB-Persistenz ORM entfällt Persistenzkonzepte, Caching und Synchronisation bleiben. Probieren Sie z.b. db4o, Sie werden staunen, wie leicht das ist! (www.db4o.com) (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 46

Die wichtigsten Java-Persistenzframeworks Hibernate Der Klassiker (~2002) Gavin King & Team Bekannt als ORM-Framework Konzept- und Begriffsbilder (Persistenz, Entity, ) JDO - Java Data Objects Spezifikation, einige Referenz-Implementierungen Vereinfachte Persistenz von POJOS D.h. persistente Objekte müssen nichts implementieren JPA Java Persistence API Modernstes Konzept, Spezifikation Bestandteil von JEE (EJB 3.0) aber herauslösbar Ebenfalls POJO-Persistenz (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 47

Weitere Java-ORM-Frameworks (open source) Ibatis SQL Maps OJB Torque Castor Cayenne TJDO JDBM Prevayler JPOX Speedo Jaxor pbeans SimpleORM Smyle XORM O/R Broker Mr.Persister Java Ultra Light Persistence JDBCPersistence Ammentos Velosurf PAT daozero QLOR ODAL JPersist BeanKeeper Open JPA Super CSV SeQuaLite Persist... http://java-source.net/open-source/persistence (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 48

Versprochen, das war's in Sachen Persistenz! (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 49

Anhang: Annotations-Details (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 50

ORM: Beziehungsspezifikation per Annotation Unidirektionale 1:1-Beziehung Kunde Agentur 0..1 0..1 @Entity public class Kunde { private int id; private Agentur agentur;... @OneToOne @JoinColumn(name="AGENTUR-ID") public Agentur getagentur() { return agentur; } } (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 51

ORM: Beziehungsspezifikation per Annotation Bidirektionale 1:1-Beziehung Kunde Agentur 0..1 0..1 @Entity public class Kunde { private int id; private Agentur agentur;... @OneToOne @JoinColumn(name="AGENTUR-ID") public Agentur getagentur() { return agentur; } } @Entity public class Agentur { private int id; private Kunde kunde;... @OneToOne(mappedBy="agentur") public Agentur getkunde() { return kunde; } (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 52 }

ORM: Beziehungsspezifikation per Annotation Unidirektionale 1:N-Beziehung Agentur 0..1 * Kunde @Entity @Entity public class Agentur { public class Kunde { private int id; private int id; private Collection<Kunde> kunden;...... } @OneToMany(cascade=CascadeType.ALL) public Collection<Kunde> getkunden() { return kunden; }... } (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 53

ORM: Beziehungsspezifikation per Annotation Bidirektionale 1:N-Beziehung Agentur 0..1 * Kunde @Entity public class Agentur { private int id; private Collection<Kunde> kunden;... @OneToMany(cascade=CascadeType.ALL mappedby="agentur") public Collection<Kunde> getkunden() { return kunden; } }... @Entity public class Kunde { private int id; private Agentur agentur;... @ManyToOne @JoinColumn(name="AGENTUR_ID public Agentur getagentur() { return agentur; } } (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 54

ORM: Beziehungsspezifikation per Annotation Bidirektionale M:N-Beziehung @Entity public class Agentur { private int id; private Collection<Kunde> kunden;... @ManyToMany @JoinTable(name="AGENTUR_KUNDE", joincolumns= @JoinColumn(name="AGENTUR_ID", referencedcolumnname="id"), inversejoincolumns= @JoinColumn(name="KUNDE_ID", referencedcolumnname="id") ) public Collection<Kunde> getkunden() { return kunden; }... } Agentur * * @Entity public class Kunde { private int id; private Collection<Agentur> agenturen; (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 55 }... @ManyToMany (mappedby=kunden) public Collection<Agentur> getagenturen() { return agenturen; } Kunde

ORM: Vererbungsabbildung per Annotation InheritanceType @Entity @Inheritance(strategy=InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name="TYP", discriminatortype=char) @DiscriminatorValue("K") public abstrct class Kunde { private int id;... } Privatkunde Kunde Firmenkunde @Entity @DiscriminatorValue("P") public abstrct class Privatkunde extends Kunde {... } @Entity @DiscriminatorValue("F") public abstrct class Fimenkunde extends Kunde {... } (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 56

Persistenz: Kaskadierungspezifikation per Annotation @Entity public class Agentur { private int id; private Collection<Kunde> kunden;... @OneToMany(cascade= { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.REMOVE } mappedby="agentur") public Collection<Kunde> getkunden() { return kunden; }... } (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 57

Persistenz: Nachladestrategie per Annotation @Entity public class Agentur { private int id; private Collection<Kunde> kunden;... @OneToMany(cascade= CascadeType.ALL, fetchtype=fetchtype.lazy, mappedby="agentur") public Collection<Kunde> getkunden() { return kunden; }... } (c) schmiedecke 12 SE2-6-Persistenz-Frameworks 58