4. Java Persistence API (JPA)

Größe: px
Ab Seite anzeigen:

Download "4. Java Persistence API (JPA)"

Transkript

1 4. Java Persistence API (JPA) Problem: OO in relationale DB Idee des Persistence Mapper Einfache Entity-Klasse Lebenslauf eines Entity-Objekts Umsetzung von 1:N- und M:N-Relationen Geordnete Daten Anfragen Vererbung Validierung 141

2 Literatur JPA 2.0: Sun Microsystem: JSR 317: JavaTMPersistence _0_final-spec.pdf ist der Standard; trotzdem sehr gut lesbar!) Auch für Teile der weiteren Vorlesung C. Bauer, G. King, Java PersistencewithHibernate, Manning, Greenwich (USA) 2007 M. Keith, M. Schincariol, Pro EJB 3 -Java PersistenceAPI, Apress, Berkeley (USA),

3 Klassische Wege zur Verbindung SW und DB DB werden meist nicht alleine entwickelt, sie müssen mit umgebender SW integriert werden. Es gibt verschiedene Ansätze, die gerade bei der Anbindung von OO-SW relevant sind: - SW wird (z.b: mit PL/SQL) in der Datenbank entwickelt (hierzu gibt es auch objektorientierte Ansätze), externe SW kann auf Prozeduren und Funktionen zugreifen. - SQL-Aufrufe werden direkt in die SW eingebettet (Embedded SQL) bzw. Aufrufe werden durch ein einfaches Framework (z.b. JDBC, SQLJ) gekapselt. (Frage: wie bekomme ich Objekte in die DB?) - DB- und SW- wird eng miteinander verzahnt, hierzu stehen ausgereifte Development- Frameworks zur Verfügung (EJB,.NET) 143

4 Nutzung relationaler DB in OO-Programmen Bisheriger Ansatz: relationale DB vorhanden, wird an OO-Programm angeschlossen. Oberfläche + Geschäftslogik DB-Zugriffsschicht Was ist, wenn DB zusammen mit OO- Programm entwickelt wird? erster Ansatz: warum nicht genau so vorgehen z.b. JDBC relationale Datenbank 144

5 Lagerverwaltung (ein kleines OO-Modell) Lagerraum -nummer : String +verkaufswertberechnen() : float - artikel bezeichnet eine Collection von Produkten in einem Lagerraum - mit verkaufspreis() wird die Mehrwertsteuer eingerechnet, die bei Büchern anders sein soll. 1 beinhaltet -artikel * Produkt -name : String -lagermenge : int -preis : float +Produkt() : Produkt +verfuegbareanzahl() : int +verkauft(anzahl : int) : void +einlagern(anzahl : int) : void +verkaufspreis() : float Lebensmittel -verfallsdatum : Date +verlustam(stichtag : Date) : float Buch +verkaufspreis() : float 145

6 Aufgabe und Ansatz Objekte der im Lagerhaltungsmodell vorgestellten Klassen sollen persistent in einer relationalen DB abgespeichert werden Bei der Anbindung an die Datenbank sollen möglichst viele OO-Errungenschaften (Kapselung, Vererbung, Polymorphismus) übernommen werden Grundidee: Das Klassendiagramm kann ohne Methoden als ER-Diagramm gelesen werden, es beinhaltet eine 1:N und zwei 1:C Beziehungen. Anmerkung: Dieser Übersetzungsansatz war ein beliebtes Tummelfeld von Programmierern, es wird nur ein möglicher Ansatz vorgestellt. 146

7 Umgang mit Kapselung Objekte der Klasse Produkt können leicht in folgende Tabelle übersetzt werden. Produkt OID name lagermenge preis Produkt -name : String -lagermenge : int -preis : float +Produkt() : Produkt +verfuegbareanzahl() : int +verkauft(anzahl : int) : void +einlagern(anzahl : int) : void +verkaufspreis() : float zusätzlicher Primary Key vergeben, falls namenicht eindeutig Kapselungsidee wird aufgegeben, da man über die Datenbank immer direkt auf die Attribute zugreifen kann, nur durch Mehraufwand einschränkbar: Lösung auf der Zugriffsebene im OO-Programm (umgehbar) Spezielle Nutzer und Rechte, Nutzung von Views (Aufwand) 147

8 Anmerkungen Typischerweise werden Klassenvariablen nicht mit den jeweiligen Objekten abgespeichert, sie müssen explizit behandelt werden Es stellt sich generell die Frage, welche zusätzlichen Informationen in welchen Tabellen verwaltet werden sollen 148

9 Umgang mit Vererbung Vererbung kann durch eine zusätzliche Tabelle mit einer Referenz implementiert werden, dabei ist OID Schlüssel und Fremdschlüssel aus Produkt Lebensmittel OID verfallsdatum Produkt Lebensmittel -verfallsdatum : Date +verlustam(stichtag : Date) : float Für jede Vererbungsebene wird eine neue Tabelle benötigt, was den Zugriff aufwändig macht Durch die vorgeschlagene Struktur wird die Sichtweise ein Lebensmittel ist ein Produkt unterstützt 149

10 Umgang mit Polymorphismus Wie funktioniert Polymorphismus? public float verkaufswertberechnen(){ float ergebnis=0.0f; for(produkt tmp:artikel) ergebnis= ergebnis+ tmp.verfuegbareanzahl()*tmp.verkaufspreis(); return ergebnis; In der bisherigen relationalen Übersetzung muss sichergestellt werden, dass das richtige Objekt geladen wird Die genaue Klassendefinition bekommt man im vorgestellten Ansatz nur, wenn man alle zu Unterklassen gehörigen Tabellen untersucht, ob die OID vorkommt Alternativ kann man sich die genaue Klassenzugehörigkeit in einem weiteren Attribut der Tabelle Produkt merken 150

11 Umgang mit Objektidentität Objektidentität in der Datenbank wird durch den Primary Key garantiert Wird das Objekt aus der Datenbank gelesen, ist der Nutzer verantwortlich, dass kein zweites Exemplar des gleichen Objekts geladen wird Alternative: Beim ersten Herauslesen wird ein Flag (ein zusätzliches Attribut) gesetzt, dass sich das Exemplar außerhalb der DB befindet (Ansatz fordert viel Programmierdisziplin, insbesondere bei der Programmterminierung) 151

12 Umgang mit Beziehungen zwischen Objekten Exemplarvariablen, die Collections oder andere nicht triviale Objekttypen enthalten, müssen explizit durch eine oder mehrere Relationen oder Erweiterungen von Tabellen modelliert werden (der Ansatz ist vom Übergang vom ER-Diagramm zur Tabellenstruktur bekannt) Lagerraum Produkt 1 beinhaltet -artikel * Produkt OID name lagermenge preis lagerraum_oid Frage: Warum passt die skizzierte Lösung eigentlich nicht zum UML-Diagramm? 152

13 Bearbeiten von Objekten Wir haben gesehen, dass einfache Objekte häufig über mehrere Tabellen verteilt werden, d.h. zum Einlesen und Bearbeiten sind relativ aufwändige SQL-JOINS notwendig Weiterhin muss das OO-Programm die eindeutige Referenz eines Objektes in der relationalen DB kennen Beispiel: Einlesen eines Lebensmittels, das an eine Variable mit Namen banane gebunden war SELECT name, lagermenge, preis, verfallsdatum FROM Identifikation, Lebensmittel, Produkt WHERE Identifikation.Name = 'banane' AND Identifikation.OID = Produkt.OID AND Produkt.OID = Lebensmittel.OID 153

14 Zwischenfazit Selbst bei Beispielen, in denen der Einsatz relationaler Datenbanken sinnvoller Standard ist (Lagerverwaltung), wird die Verknüpfung eines OO-Programms mit relationaler Datenhaltung aufwändig Die Nutzung relationaler Datenbanken in OO-Programmen sollte immer über eine DB-Kapselung, die den Zugriff auf die DB regelt, erfolgen Für den Kapselungsansatz stehen verschiedene Produkte zur Verfügung (z. B. Hibernate, EclipseLink(TopLink)), JPA spezifiziert gemeinsames Interface Verwandte Ansätze: direkte Nutzung einer OO-Datenbank, Programmierung mit JDO 154

15 Konzept von Persistence-Mappern Persistence-Mapper (PM) muss wissen, welche Objekte persistiert werden sollen -> markiere Klassen, deren Objekte verwaltet werden sollen Persistence-Mapper muss Beziehungen zwischen Objekten kennen Ablauf: Nutzer benutzt Objekt unter Verwaltung; dann übernimmt PM die Überwachung, führt Änderungen aus, regelt den Zugriff mehrerer Nutzer Ablauf: Nutzer erzeugt Objekt und muss PM einmal mitteilen, dieses zu verwalten PM kann selbst regeln, wie Aufgaben realisiert werden (Tabellenstruktur, Transaktionssteuerung) 155

16 Beispiel (1/7) package jpa20beispiel1; import javax.persistence.entity; import public class Mitarbeiter private int minr; private String name; public Mitarbeiter(){ //parameterloser Konstruktor benötigt public Mitarbeiter(int minr, String name) { //erlaubt this.minr = minr; this.name = name; public int getminr() {return minr; public void setminr(int minr) {this.minr = minr; public String getname() {return name; public void setname(string name) {this.name = name; 156

17 Beispiel (2/7) persistence.xml liegt im Ordner META-INF (projektartabhängig) Detaileinstellungen von JPA-Realisierung abhängig (z. B. EclispeLink (basiert auf TopLink), Hibernate, Apache OpenJPA) <?xml version="1.0" encoding="utf-8"?> <persistence version="2.0" xmlns=" xmlns:xsi=" instance" xsi:schemalocation=" <persistence-unit name="jpa20beispiel1pu" transaction-type="resource_local"> type="resource_local"> <provider> org.eclipse.persistence.jpa.persistenceprovider </provider> <class>jpa20beispiel1.mitarbeiter</class> 157

18 158 Beispiel (3/7) <properties properties properties properties> <property property property property name name name name="javax.persistence.jdbc.url" ="javax.persistence.jdbc.url" ="javax.persistence.jdbc.url" ="javax.persistence.jdbc.url" value value value value=" =" =" ="jdbc:derby jdbc:derby jdbc:derby jdbc:derby:// :// :// ://localhost:1527/spielerei"/> localhost:1527/spielerei"/> localhost:1527/spielerei"/> localhost:1527/spielerei"/> <property property property property name name name name=" =" =" ="javax.persistence.jdbc.password javax.persistence.jdbc.password javax.persistence.jdbc.password javax.persistence.jdbc.password" value value value value=" =" =" ="kleuker kleuker kleuker kleuker"/> "/> "/> "/> <property property property property name name name name=" =" =" ="javax.persistence.jdbc.driver javax.persistence.jdbc.driver javax.persistence.jdbc.driver javax.persistence.jdbc.driver" value value value value=" =" =" ="org.apache.derby.jdbc.clientdriver org.apache.derby.jdbc.clientdriver org.apache.derby.jdbc.clientdriver org.apache.derby.jdbc.clientdriver"/> "/> "/> "/> <property property property property name name name name=" =" =" ="javax.persistence.jdbc.user javax.persistence.jdbc.user javax.persistence.jdbc.user javax.persistence.jdbc.user" value value value value=" =" =" ="kleuker kleuker kleuker kleuker"/> "/> "/> "/> <property property property property name name name name=" =" =" ="eclipselink.ddl eclipselink.ddl eclipselink.ddl eclipselink.ddl-generation" generation" generation" generation" value value value value=" =" =" ="drop drop drop drop-and and and and-create create create create-tables tables tables tables"/> "/> "/> "/> </ </ </ </properties properties properties properties> </ </ </ </persistence persistence persistence persistence-unit> unit> unit> unit> </ </ </ </persistence persistence persistence persistence>

19 Beispiel (4/7) 159

20 Beispiel (5/7) package jpa20beispiel1; import java.util.list; import javax.persistence.entitymanager; import javax.persistence.entitymanagerfactory; import javax.persistence.persistence; public class Main { private EntityManagerFactory emf = Persistence. createentitymanagerfactory("jpa20beispiel1pu"); private EntityManager em = emf.createentitymanager(); public void beispieldaten() { String namen[] = {"Egon", "Erwin", "Ute", "Aise Aise"; em.gettransaction(). ().begin begin(); for (int i=0; i<namen.length namen.length; i++) em.persist(new Mitarbeiter(i,namen i,namen[i])); em.gettransaction(). ().commit commit(); 160

21 Beispiel (6/7) public void datenzeigen() { for (Mitarbeiter m : em.createquery( "SELECT m FROM Mitarbeiter m",mitarbeiter.class Mitarbeiter.class).getResultList getresultlist()) { System.out.println(m.getMinr m.getminr() + ": " + m.getname()); public void schliessen() { if (em!= null && em.isopen()) {em.close em.close(); if (emf!= null && emf.isopen()) {emf.close emf.close(); public static void main(string[] args) { Main m = new Main(); m.beispieldaten(); m.datenzeigen(); m.schliessen(); 1: Egon 2: Erwin 4: Aise 3: Ute 161

22 Beispiel (7/7) Falls noch keine Tabelle Mitarbeiter existiert, wird diese angelegt 162

23 Suchen und Bearbeiten von einzelnen Objekten public void namenaendern(){ int eingabe=-1; while(eingabe!=0){ System.out.print("Welche Nummer (Ende mit 0): "); eingabe=new Scanner(System.in).nextInt(); Mitarbeiter m = em.find(mitarbeiter.class, eingabe); if(m == null) System.out.println("Witzbold"); else{ System.out.print("Neuer Name (alt:"+m.getname()+"): "); String name=new Scanner(System.in).next(); EntityTransaction tr = em.gettransaction(); tr.begin(); m.setname(name); tr.commit(); 163

24 Zentrale Klassen Aufbau der Verbindung EntityManagerFactory emf = Persistence. createentitymanagerfactory("jpa20beispiel1pu"); Einrichtung sehr aufwändig, selten neu erstellen Einrichtung der Verbindung für den Nutzer EntityManager em = emf.createentitymanager(); kostet Zeit, gibt trotzdem meist sinnvoll Objekt häufiger zu erzeugen und zu schließen/löschen Nutzung einer Transaktion EntityTransaction tr = em.gettransaction(); kurzfristig nutzen: Daten vorbereiten, dann DB-Zugriff, dann schließen letztendlich immer alles schließen(typisch in finally-block) Generelles Verhalten hängt von DB ab, in Großprojekten immer mit erfahrenem DB-Administrator arbeiten 164

25 Entity ist POJO Entity-Klassen-Objekte sind klassische Plain Old Java Objects Verpflichtung: public (oder protected) Konstruktor ohne Parameter Exemplarvariablen private oder protected, Zugriff über get... und set... Klasse, Methoden, Exemplarvariablen nicht final Serialisierbar [zumindest sehr sinnvoll] keine weiteren Einschränkungen beliebige weitere Methoden Vererbung (auch Entity von Nicht-Entity [aufwändig]) Nutzung abstrakte Klassen 165

26 Primary Key Typisch: Primary Key = GenerationType.AUTO) private int minr; folgende Datentypen erlaubt primitive Java-Typen (int, long, ) Wrapper von primitiven Java-Typen (Integer, Long, ) java.lang.string java.util.date java.sql.date 166

27 Persistierbare Typen/Klassen Primitive Typen (byte, char, int, long, float, double, boolean) java.lang.string Andere serialisierbare Typen: Wrapper der primitiven Typen java.math.biginteger java.math.bigdecimal java.util.date, java.util.calendar java.sql.date, java.sql.time, java.sql.timestamp Nutzerdefinierte serialisierbare Typen byte[], Byte[], char[], Character[] Enumeration Andere Entities Collections von Entities (Collection, Set, List, Map) 167

28 Persistent Fields / Properties Persistent private int minr; Exemplarvariablen direkt annotiert Zugriff des Persistence-Frameworks direkt auf Variablen Vorteil: Variable und Annotation stehen direkt zusammen Persistent public int getminr{ return this.minr; get-methode wird annotiert Zugriff auf Exemplarvariablen muss immer über Standard get erfolgen (auch in der Klasse selbst) Vorteil: Flexibilität, da Methode weitere Funktionalität haben kann 168

29 Annotationen zur Flexibilisierung name="chef") public class Mitarbeiter implements Serializable { private static final long serialversionuid GeneratedValue(strategy = GenerationType.AUTO) private int Column(name name="leiter", nullable=false, updatable=true, unique=true) private String name;

30 PersistenceContext Wird für Objekte vorher festgehaltener Klassen definiert Entspricht einem Cache, der MANAGED-Objekte verwaltet EntityManager-Objekt für konkreten PersistenceContext EntityManager-Operationen arbeiten auf dem Cache Man muss EntityManager mitteilen, dass Daten in die DB geschrieben werden müssen em.gettransaction().commit(); Beim Schreiben können wg. der Transaktionssteuerung der DB Exceptions auftreten (abhängig von Steuerungsart) Im Zweifel bei immerechte Tabellen anschauen Üblich: nur kurz lebende EntityManager (erzeugen, Aktion, schließen) 170

31 Beispiel für Cache public class Mitarbeiter implements private int //maximal zwei Zeichen private String name; public Mitarbeiter() { //parameterloser Konstruktor benötigt public Mitarbeiter(String name) { this.name = name; // get- und set-methoden public String tostring(){ return name+"("+minr+")"; 171

32 Beispiel für Cache (2/2) public static void main(string[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("JPACachePU"); EntityManager em=emf.createentitymanager(); em.gettransaction().begin(); em.persist(new Mitarbeiter("ET")); em.persist(new Mitarbeiter("JFK")); for(int i=1;i<3;i++) System.out.println(em.find(Mitarbeiter.class,i)); em.gettransaction().commit(); em.close(); ET(1) JFK(2) [EL Warning]: :12: UnitOfWork( ) UnitOfWork( )- Exception [EclipseLink-4002]: org.eclipse.persistence.exceptions.databaseexception Internal Exception: java.sql.sqldataexception: Bei dem Versuch, VARCHAR 'JFK' auf die Länge 2 zu kürzen, ist ein Abschneidefehler aufgetreten. 172

33 Lebenslauf eines Entity-Objekts NEW -> merge() führt evtl. zur Mehrfachobjekterzeugung refresh() nur, wenn vorher persistiert 173

34 Unterschied: Lokal und DB immer beachten public static void main(string[] args) { EntityManagerFactory emf = Persistence. createentitymanagerfactory("jpa20beispiel1pu"); EntityManager em = emf.createentitymanager(); Mitarbeiter m1 = new Mitarbeiter("Ford"); Mitarbeiter m2 = new Mitarbeiter("Arthur"); em.gettransaction().begin(); 2: Arthur em.persist(m1); 1: Manta em.persist(m2); Ford(1) em.gettransaction().commit(); m1.setname("manta"); for (Mitarbeiter m : em.createquery( "SELECT m FROM Mitarbeiter m", Mitarbeiter.class).getResultList()) System.out.println(m.getMinr() + ": " + m.getname()); em.close(); em.refresh(m1); System.out.println(m1); 174

35 Sauberes Persistieren Auslagerung der Persistierung in eine Methode mit sauberer Exception-Behandlung Anmerkung: man muss nicht immer em.close() machen public void persist(object object) { em.gettransaction(). ().begin begin(); try { em.persist(object object); em.gettransaction(). ().commit commit(); catch (Exception e) { if (em.gettransaction em.gettransaction(). ().isactive isactive()) em.gettransaction(). ().rollback rollback(); throw e; finally { em.close(); 175

36 Notwendigkeit von merge (1/3) public class Main { private EntityManagerFactory emf = Persistence.createEntityManagerFactory(" ("JPAMerge JPAMerge"); private EntityManager em = emf.createentitymanager(); public static void main(string[] args) { new Main().mach1(); public void datenzeigen() { for (Mitarbeiter m : em.createquery( "SELECT m FROM Mitarbeiter m",mitarbeiter.class Mitarbeiter.class).getResultList getresultlist()) System.out.println(m.getId m.getid() + ": " + m.getname()); 176

37 Notwendigkeit von merge (2/3) public void mach1() { Mitarbeiter m1 = new Mitarbeiter("Urs"); em.gettransaction(). ().begin begin(); em.persist(m1); em.gettransaction(). ().commit commit(); datenzeigen(); Mitarbeiter m2 = em.find(mitarbeiter.class Mitarbeiter.class, m1.getid()); em.close(); mach2(m2); public void mach2(mitarbeiter m2) { m2.setname("ute"); em = emf.createentitymanager(); em.gettransaction(). ().begin begin(); em.persist(m2); em.gettransaction(). ().commit commit(); datenzeigen(); em.close(); 1: Urs Internal Exception: java.sql.sqlintegritycons traintviolationexception:.. zu einem duplizierten Schlüsselwert geführt hätte. 177

38 Notwendigkeit von merge (3/3) public void mach2(mitarbeiter m2) { m2.setname("ute"); em = emf.createentitymanager(); em.gettransaction(). ().begin begin(); //em.persist em.persist(m2); em.merge(m2); em.gettransaction(). ().commit commit(); datenzeigen(); 1: Urs 1: Ute Hinweis: Verzichtet man zwischenzeitlich auf das Schließen des EntityManagers, funktioniert persist() genauso gut zur Aktualisierung sollte merge() genutzt werden 178

39 Klasse oder Tabelle? Bei der Entity-Nutzung offen, ob erst Klassen designt und dann Tabellen entworfen werden Einfach: Tabellen existieren; dann typischerweise zur Tabelle eine Entity-Klassse erstellbar (generierbar) Wenn nichts gegeben: Entwurf der Entity-Klassen (Daten der Applikation mit ihren Abhängigkeiten) Ableitung oder Generierung der Tabellen Generierungsansätze: Drop and Create: beteiligte Tabellen löschen und neu anlegen ( und Test) Create: wenn nicht existent, dann anlegen (Realität) None: wenn nicht existent, dann Fehler (Realität) Hinweis: bei Änderungen neu übersetzen 179

40 Generelle JEE-Regel Convention over Configuration bedeutet: wenn nichts angegeben wird, wird ein Default- Wert genutzt Default-Werte sind zwar sinnvoll, sollte man aber kennen Erinnerung: Java-Inkonsistenz 180

41 Einschub: XML-Konfiguration Statt Annotationen zu nutzen, können diese Informationen auch in XML beschrieben werden Typisch: eine XML-Datei pro Klasse + zusammenführende XML-Datei Vorteil: Verhaltensänderungen ohne Codeänderung Nachteil: viele kleine penibel zu pflegende Dateien Auch möglich: XML und Annotationen; dabei schlägt XML die Annotationen 181

42 Kardinalitäten in JPA A x 1:1 zu einem A-Objekt gehört (maximal) ein anderes B- Objekt, die jeweils zu (maximal) einem A-Objekt gehören 1:N zu einem A-Objekt gehören beliebig viele B-Objekte, die jeweils zu (maximal) einem A-Objekt gehören (N:1 analog) M:N zu einem A-Objekt gehören beliebig viele B-Objekte, die jeweils zu beliebig vielen A-Objekten gehören Anders als bei Tabellen haben OO-Assoziationen Leserichtungen Unidirektional: nur von einer Seite auf die andere schließbar Bidirektional: Abhängigkeit in beide Richtungen manövrierbar (es gibt Besitzer der Beziehung; für Updates wichtig) y B 182

43 Umsetzung unidirektional 1:N public class Projektauftrag implements private int paid; private String titel; public String gettitel() { return titel; public void settitel(string titel) { this.titel = titel; 183

44 Umsetzung unidirektional 1:N public class Projekt implements private int projektid; private String OneToMany(cascade cascade=cascadetype.persist CascadeType.PERSIST) private Set<Projektauftrag> auftraege; public Projekt(){ auftraege = new HashSet<Projektauftrag>(); // fehlen get- und set-methoden (auch add wäre sinnvoll) 184

45 Umsetzung unidirektional 1:N (3/4) public void datenanlegen(){ String p[] ={"Hotel", "Noten", "Belegung"; String a[] ={"Analyse", "Modell", "Design"; em.gettransaction().begin(); for (int i=0; i<p.length;i++){ Projekt pr= new Projekt(); pr.setname(p[i]); for (int j=0; j<a.length;j++){ Projektauftrag pa= new Projektauftrag(); pa.settitel(a[j]); Set<Projektauftrag> tmp= pr.getauftraege(); tmp.add(pa); em.persist(pr); em.gettransaction().commit(); 185

46 Umsetzung unidirektional 1:N (4/4) SELECT PROJEKT.PROJEKTID, PROJEKT.NAME, PROJEKTAUFTRAG.PAID, PROJEKTAUFTRAG.TITEL FROM PROJEKT, PROJEKT_PROJEKTAUFTRAG, PROJEKTAUFTRAG WHERE PROJEKT.PROJEKTID = PROJEKT_PROJEKTAUFTRAG.PROJEKT_PROJEKTID AND PROJEKTAUFTRAG.PAID = PROJEKT_PROJEKTAUFTRAG.AUFTRAEGE_PAID; 186

47 CascadeType.MERGE) MERGE : merge() implizit für verknüpfte Objekte aufrufen PERSIST: persist() implizit für verknüpfte Objekte aufrufen REFRESH: refresh() implizit für verknüpfte Objekte aufrufen REMOVE: remove() implizit für verknüpfte Objekte aufrufen ALL: alle vier genannten Möglichkeiten Default-Einstellung: keine der fünf Varianten Wichtige Design-Entscheidung, was sinnvoll ist REMOVE nur nutzbar Beispiel, wenn Cascade.PERSIST fehlte SCHWERWIEGEND: Could not synchronize database state with session org.hibernate.transientobjectexception: object references an unsaved transient instance - save the transient instance before flushing: Projektauftrag 187

48 Umsetzung bidirektional 1:N (1/5) -Bidirektionale Relationen haben Eigentümer (owner side) und Abhängigen (inverse side) -Eigentümer bei 1:N ist N (hier Projektauftrag) -Abhängiger bekommt mappedby-attribut -Programmierer für Einträge auf beiden Seiten verantwortlich 188

49 Umsetzung bidirektional 1:N public class Projektauftrag implements private int paid; private String CascadeType.MERGE) private Mitarbeiter bearbeiter; //

50 Umsetzung bidirektional 1:N public class Mitarbeiter implements Serializable { private static final long serialversionuid GeneratedValue(strategy = GenerationType.AUTO) private int minr; private String OneToMany(mappedBy mappedby=" ="bearbeiter bearbeiter", cascade={ ={CascadeType.PERSIST CascadeType.PERSIST, CascadeType.MERGE) private Set<Projektauftrag> auftraege = new HashSet<Projektauftrag>(); public void auftraghinzu(projektauftrag pa){ auftraege.add(pa pa); //

51 Umsetzung bidirektional 1:N (4/5) public void mitarbeiterzuordnen(){ Mitarbeiter m[]= {new Mitarbeiter("Egon"), new Mitarbeiter(" ("Aise Aise"), new Mitarbeiter("Urs"); em.gettransaction(). ().begin begin(); for (int i=0; i<m.length m.length; i++) em.persist(m[i]); for (Projektauftrag p : (List<Projektauftrag>) em. createquery("select p FROM Projektauftrag p"). getresultlist()) if(p.gettitel p.gettitel(). ().equals equals("analyse")){ JPA 1.0- m[0].auftraghinzu auftraghinzu(p); p.setbearbeiter(m[0]); Variante der Anfrage else{ m[1].auftraghinzu auftraghinzu(p); p.setbearbeiter(m[1]); em.gettransaction(). ().commit commit(); 191

52 Umsetzung bidirektional 1:N (5/5) SELECT MITARBEITER.NAME, MITARBEITER.MINR, PROJEKTAUFTRAG.TITEL, PROJEKTAUFTRAG.PAID FROM MITARBEITER LEFT JOIN PROJEKTAUFTRAG ON (MITARBEITER.MINR=PROJEKTAUFTRAG.BEARBEITER_MINR) ; 192

53 Umsetzung ist OR-Mapper freigestellt Man sieht, dass bei bidirektionalen Beziehungen in EclipseLinkkeine neuen Tabellen angelegt werden, bei unidirektionalen schon 193

54 Wichtige Annotationen in int version Attribut wird für das optimistische Lockinggenutzt; erst beim Schreiben geschaut, ob sich Versionsnummer geändert hat performant, wenn Objekte nicht häufig geändert werden Einfach als zusätzliches Attribut fetch=fetchtype.lazy FetchType.LAZY) private Set<Projektauftrag> auftraege EAGER: Alle Daten des Attributs werden bei Objektnutzung sofort in Hauptspeicher geladen (default) LAZY: Daten werden erst geladen, wenn benötigt Längere Listen oder komplexe Daten möglichst immer LAZY (versteckte Konsistenzprobleme möglich) Wenn eine Info sofort benötigt, ist Kette zur Info EAGER 194

55 Umsetzung bidirektional M:N (1/6) 195

56 Umsetzung bidirektional M:N public class Projektauftrag implements private int paid; private String CascadeType.MERGE) private Mitarbeiter CascadeType.MERGE) private Rolle private int version; 196

57 Umsetzung bidirektional M:N public class Rolle implements private int rid; private String name; private int ManyToMany(cascade = {CascadeType.PERSIST CascadeType.PERSIST, = FetchType.LAZY) private List<Mitarbeiter> private int version; public void mitarbeiterhinzu(mitarbeiter m) { mitarbeiter.add(m); 197

58 Umsetzung bidirektional M:N public class Mitarbeiter implements GeneratedValue(strategy = GenerationType.AUTO) private int minr; private String OneToMany(mappedBy = "bearbeiter bearbeiter", cascade = {CascadeType.PERSIST CascadeType.PERSIST, = FetchType.LAZY) private Set<Projektauftrag> ManyToMany(mappedBy = "mitarbeiter mitarbeiter", cascade = {CascadeType.PERSIST CascadeType.PERSIST, = FetchType.LAZY) private Set<Rolle> rollen = new HashSet<Rolle private int version; public void rollehinzu(rolle r) { rollen.add(r (r); 198

59 Umsetzung bidirektional M:N (5/6) public void mitarbeiterzuordnen() { Mitarbeiter m[] = {new Mitarbeiter("Egon"), new Mitarbeiter(" ("Aise Aise"), new Mitarbeiter("Urs"); em.gettransaction(). ().begin begin(); for (int i = 0; i < m.length; i++) em.persist(m[i]); Rolle r[] = {new Rolle("OOAD",80), new Rolle("SVN",60), new Rolle("QS",100); for (int i = 0; i < r.length; i++) { for(int j = 0; j<m.length m.length; j++) if(r[i]. (r[i].getname getname(). ().length length()<m[j]. ()<m[j].getname getname(). ().length length()){ r[i].mitarbeiterhinzu mitarbeiterhinzu(m[j]); m[j].rollehinzu rollehinzu(r[i]); em.persist(r[i]); // Rollenzuordnung wie bei 1:N mitarbeiterzuordnen() em.gettransaction(). ().commit commit(); 199

60 Umsetzung bidirektional M:N (6/6) 200

61 Tabellenstruktur 201

62 Ungeordnete Daten public class Punkt private int id; private int x; private int private int version; public Punkt(int x, int y) { this.x = x; this.y = y; public public String tostring(){ return "["+x+","+y+"]"; // get- und set-methoden für Exemplarvariablen Problem: Auch Listen werden ungeordnet gespeichert 202

63 Ungeordnete Daten public class Polygon private int OneToMany(cascade = {CascadeType.ALL CascadeType.ALL) private List<Punkt> punkte= new private int version; public Polygon(){ //get und set für Exemplarvariablen public void punktehinzu(punkt... pkte){ for(punkt p:pkte) public String tostring(){ StringBuffer erg=new StringBuffer("<"); for(punkt p:punkte) erg.append(p.tostring p.tostring()); return erg.append(">"). (">").tostring tostring(); 203

64 Ungeordnete Daten (3/4) public class Main { private EntityManagerFactory emf = Persistence.createEntityManagerFactory("JPA20NeueFeaturesPU"); private EntityManager em = emf.createentitymanager(); public void objekteerzeugen(){ Punkt[] pkt={ ={new Punkt(0,0), new Punkt(5,3), new Punkt(3,3), new Punkt(3,0); em.gettransaction(). ().begin begin(); for(punkt p:pkt) em.persist(p); em.gettransaction(). ().commit commit(); Polygon p1 = new Polygon(); p1.punktehinzu(pkt pkt[0], [0],pkt pkt[1], [1],pkt pkt[2]); Polygon p2 = new Polygon(); p2.punktehinzu(pkt pkt[3], [3],pkt pkt[2], [2],pkt pkt[1]); em.gettransaction(). ().begin begin(); em.persist(p1); em.persist(p2 (p2); em.gettransaction(). ().commit commit(); 204

65 Ungeordnete Daten (4/4) public void zeigepolygone(){ List<Polygon> pl = em.createquery( "SELECT p FROM Polygon p",polygon.class Polygon.class). ).getresultlist getresultlist(); for(polygon po:pl) System.out.println(po po); public void schliessen() { if (em!= null && em.isopen()) em.close(); if (emf!= null && emf.isopen()) emf.close(); public static void main(string[] args) { Main m= new Main(); m.objekteerzeugen(); <[0,0][5,3][3,3]> m.zeigepolygone(); <[3,0][3,3][5,3]> m.schliessen(); System.out.println(" (" "); ---- m= new Main(); <[0,0][5,3][3,3]> m.zeigepolygone(); <[5,3][3,3][3,0]> m.schliessen(); 205

66 Ordnung public class Polygon private int OneToMany(cascade = {CascadeType.PERSIST CascadeType.PERSIST, OrderColumn(name name=" ="Ord Ord") private List<Punkt> punkte= new private int version; <[3,0][3,3][5,3]> <[0,0][5,3][3,3]> ---- <[3,0][3,3][5,3]> <[0,0][5,3][3,3]> Hinweis: persistence.xml mit create 206

67 Standard: keine Löschfortsetzung (1/2) public void objekteerzeugen() { Punkt[] pkt = {new Punkt(0, 0), new Punkt(5, 3), new Punkt(3, 3); Polygon p1 = new Polygon(); p1.punktehinzu(pkt pkt[0], pkt[1], pkt[2]); em.gettransaction(). ().begin begin(); em.persist(p1); em.gettransaction(). ().commit commit(); public void objektebearbeiten() { Polygon pl = em.createquery("select p FROM Polygon p", Polygon.class). ).getresultlist getresultlist(). ().get get(0); pl.getpunkte(). ().remove remove(1); em.gettransaction(). ().begin begin(); em.persist(pl pl); em.gettransaction(). ().commit commit(); 207

68 Standard: keine Löschfortsetzung (2/2) public void zeigepolygoneundpunkte() { for (Polygon po : em.createquery("select p FROM Polygon p", Polygon.class). ).getresultlist getresultlist()) System.out.println(po po); System.out.println(" (" "); for (Punkt pu : em.createquery("select p FROM Punkt p", Punkt.class). ).getresultlist getresultlist()) System.out.println(pu pu); public static void main(string[] args) { Main m = new Main(); m.objekteerzeugen(); m.objektebearbeiten(); m.zeigepolygoneundpunkte(); m.schliessen(); <[0,0][3,3]> ---- [0,0] [5,3] [3,3] 208

69 Löschfortsetzung Anmerkung: auch keine Löschung alleine durch CASCADETYPE.ALL in Polygon, aber durch folgende OneToMany(cascade = {CascadeType.ALL CascadeType.ALL, <[0,0][3,3]> orphanremoval=true true) OrderColumn(name name=" ="Ord Ord") [0,0] [3,3] private List<Punkt> punkte = new ArrayList<Punkt>(); Was passiert, wenn mehrere Objekte Punkt referenzieren (widerspricht der Eigentümerschaft)? Exception in thread "main javax.persistence.rollbackexception Caused by: java.sql.sqlintegrityconstraintviolationexception: DELETE in Tabelle 'PUNKT' hat für Schlüssel (3) die Integritätsbedingung 'PLYGONPUNKTPNKTEID' für Fremdschlüssel verletzt. 209

70 Beispieldaten (in DB-Notation) Projekt Projektauftrag Rolle Projekt_Projektauftrag Mitarbeiter 210

71 Anfragen Anfragesprache soll möglichst Entity-Objekte liefern Anfragesprache soll DB-unabhängig sein (SQL-Detailproblem) Antwort: Java Persistence QL (JPQL) Ermöglicht direkte Zurückgabe von Entitätsobjektlisten Ermöglicht auch direkte Ausführung von SQL-Anfragen Anmerkung: Vorgänger JDO unterstützte OO-Features in JDO- QL (Methodennutzung); dies ist nicht mehr möglich Typische Struktur: SELECT p FROM Projekt p WHERE <Bed> Übersetzung: Wähle aus der Menge Projekt der gemanageten Objekte die Elemente p mit Eigenschaft <Bed> 211

72 Anfrageausführung Setzt ordentliches tostring() voraus ist nicht typsicher public void anfragen(string ql) { try { Query query = em.createquery(ql ql); Collection erg = query.getresultlist(); for (Iterator it = erg.iterator(); it.hasnext();) { System.out.println(it.next it.next()); catch (Exception e) { System.out.println("Anfrage gescheitert: " + e.getmessage()); 212

73 Einfache Beispiele Vorbemerkung: In FROM-Zeilen stehen Klassen und Attributnamen; bei diesen muss Groß-und Kleinschreibung beachtet werden! SELECT p FROM Projekt p Projekt Bonitaet (5) [Konten Historie Raten ] Projekt Bremse (11) [Display Sensoren Fusion ] Direkter Zugriff auf Attribute SELECT p.name FROM Projekt p Bonitaet Bremse 213

74 Nutzung mehrwertiger Relationen (1/2) SELECT p.auftraege FROM Projekt p Aufgabe Raten (10) durch Ivan als Java Aufgabe Konten (6) durch Fatma als Cobol Aufgabe Historie (8) durch Urs als Java Aufgabe Sensoren (12) durch Ivan als C Aufgabe Display (14) durch Fatma als Java Aufgabe Fusion (15) durch Ivan als C Nicht erlaubt: SELECT p.auftraege.bearbeiter FROM Projekt p An exception occurred while creating a query in EntityManager: Exception Description: Error compiling the query [SELECT p.auftraege.bearbeiter FROM Projekt p], line 1, column 9: invalid navigation expression [p.auftraege.bearbeiter p.auftraege.bearbeiter], cannot navigate collection valued association field [auftraege auftraege]. 214

75 Nutzung mehrwertiger Relationen (2/2) SELECT pa.bearbeiter FROM Projektauftrag pa 1: Ivan Auftraege=[ Sensoren Fusion Raten ] Rollen=[ C Java ] 1: Ivan Auftraege=[ Sensoren Fusion Raten ] Rollen=[ C Java ] 1: Ivan Auftraege=[ Sensoren Fusion Raten ] Rollen=[ C Java ] 2: Fatma Auftraege=[ Konten Display ] Rollen=[ Cobol Java ] 2: Fatma Auftraege=[ Konten Display ] Rollen=[ Cobol Java ] 3: Urs Auftraege=[ Historie ] Rollen=[ Java ] 215

76 Neu zusammengesetzte Ergebnisse Folgende Folie zeigt woher Details der Ausgabe kommen SELECT r.name, r.tagessatz FROM Rolle r [Ljava.lang.Object Ljava.lang.Object;@1db5ec :: [Ljava.lang.Object Ljava.lang.Object; C 50 [Ljava.lang.Object Ljava.lang.Object;@92b1a1 :: [Ljava.lang.Object Ljava.lang.Object; Java 60 [Ljava.lang.Object Ljava.lang.Object;@cbf9bd :: [Ljava.lang.Object Ljava.lang.Object; Cobol

77 Ausgabe mit detaillierterer Analyse public void anfragen2(string ql) { System.out.println(ql); try { Query query = em.createquery(ql); Collection erg = query.getresultlist(); for (Iterator it = erg.iterator(); it.hasnext();) { Object o = it.next(); System.out.println(o+" :: "+ o.getclass().getname()); if(o.getclass().getname().equals("[ljava.lang.object;")){ Object oa[]= (Object[]) o; for(int i=0;i<oa.length;i++) System.out.println(" "+oa[i]); catch (Exception e) { System.out.println("Anfragefehler: " + e.getmessage()); 217

78 JOIN-Varianten SELECT m.name FROM Projektauftrag pa, Mitarbeiter m WHERE pa.bearbeiter=m AND pa.titel='sensoren' SELECT m.name FROM Projektauftrag pa JOIN pa.bearbeiter m WHERE pa.titel='sensoren' Ivan SELECT DISTINCT(pa.bearbeiter.name) FROM Projekt p JOIN p.auftraege pa WHERE p.name='bremse' Fatma Ivan 218

79 Vordefinierte Anfragen + typisches Problem private static final String PROJEKT_VON= "SELECT DISTINCT(p.name) " +"FROM Projekt p JOIN p.auftraege pa " +"WHERE pa.bearbeiter.name= :mname"; public void projektvon(string name){ Query query = em.createquery(projekt_von). setparameter("mname", name); Collection erg = query.getresultlist(); for (Iterator it = erg.iterator(); it.hasnext();) { System.out.println(it.next()); projektvon("urs' OR NOT(p.name='bla') OR p.name='bla") Bremse Bonitaet 219

80 echte Standardkonformität? gerade bei Anfragen häufig keine 100%-Kompatibilität Hibernate meist etwas mächtiger als EclipseLink Beispiel: Zeige alle C-Programmierer geht: SELECT m FROM Rolle r JOIN r.mitarbeiter m WHERE r.name='c [1: Ivan... ging lange Zeit nicht in EclipseLink: SELECT m FROM Mitarbeiter m JOIN m.rollen r WHERE r.name='c' invalid navigation expression [r.name], cannot navigate expression [r] of type [java.util.list java.util.list] inside a query. trotzdem: Immer sinnvoll Objektauswahlen in Anfragesprache durchzuführen, nicht alle Objekte aus DB lutschen und dann verarbeiten 220

81 Klassische SQL-Operatoren SELECT p.name, COUNT(pa.titel pa.titel) FROM Projekt p JOIN p.auftraege pa GROUP BY p.name [Ljava.lang.Object Ljava.lang.Object;@4a9a7d :: [Ljava.lang.Object Ljava.lang.Object; Bonitaet 3 [Ljava.lang.Object Ljava.lang.Object;@1e4a47e :: [Ljava.lang.Object Ljava.lang.Object; Bremse 3 Erinnerung AVG, SUM, MIN, MAX 221

82 Named NamedQueries({ //in Mitarbeiter NamedQuery(name name=" ="Mitarbeiter.primaryKey Mitarbeiter.primaryKey", query="select m FROM Mitarbeiter m WHERE m.minr= :minr NamedQuery(name name=" ="Mitarbeiter.mitFaehigkeit Mitarbeiter.mitFaehigkeit", query="select m FROM Rolle r JOIN r.mitarbeiter m" +" WHERE r.name = :name name") ) // z. B. in Main mit lokalen Variablen minr und faehigkeit Mitarbeiter m= em.createnamedquery createnamedquery(" ("Mitarbeiter.primaryKey Mitarbeiter.primaryKey",Mitarbeiter.class Mitarbeiter.class).setParameter setparameter(" ("minr minr", minr).getsingleresult getsingleresult(); for( Mitarbeiter m:em // EclipseLink Object m:em.createnamedquery createnamedquery(" ("Mitarbeiter.mitFaehigkeit Mitarbeiter.mitFaehigkeit",Mitarbeiter.class Mitarbeiter.class).setParameter setparameter(" ("name name", faehigkeit).getresultlist getresultlist()) System.out.println(m); 222

83 Flexiblere Anfragenkonstruktion (Ausblick) public void ooartigeanfragekonstruktion(){ CriteriaBuilder qb = em.getcriteriabuilder(); CriteriaQuery<Mitarbeiter> cq = qb.createquery(mitarbeiter.class); Root<Mitarbeiter> malias= cq.from(mitarbeiter.class); cq.where(qb.notequal(malias.get("name"), "Urs")); TypedQuery<Mitarbeiter> tq=em.createquery(cq); for(mitarbeiter m:tq.getresultlist()) System.out.println(m.getName()); Ivan Fatma Heinz 223

84 Vererbung eine Tabelle public class Produkt implements private int prnr; private String name; private int lagermenge; private float private int public class Lebensmittel extends Produkt implements private Date public class Buch extends Produkt{

85 Vererbung eine Tabelle (2/3) public static void main(string[] args) { EntityManagerFactory emf =Persistence. createentitymanagerfactory("jpavererbungpu"); EntityManager em=emf.createentitymanager(); em.gettransaction().begin(); em.persist(new Buch("JPA", 2, 39.99f)); em.persist(new Produkt("Maus", 4, 7.99f)); em.persist(new Lebensmittel("Tofu", 7, 0.69f,new Date())); em.gettransaction().commit(); for(produkt p:(list<produkt>)em. createquery("select p FROM Produkt p").getresultlist()) System.out.println(p); 1:JPA Menge:2 Preis:39.99 Buch 2:Maus Menge:4 Preis:7.99 3:Tofu Menge:7 Preis:0.69 Verfall:Thu Oct 15 16:22:14 CEST

86 Vererbung eine Tabelle (3/3) SELECT * FROM Produkt Abbildung in eine Tabelle ist Default-Einstellung Ansatz meist am performantesten (float ungeeignet für Geldbeträge) 226

87 Vererbung getrennte Inheritance(strategy strategy=inheritancetype.joined InheritanceType.JOINED) public class Produkt implements Serializable {... SELECT * FROM Produkt SELECT * FROM Lebensmittel SELECT * FROM Buch 227

88 Vererbung Inheritance(strategy strategy=inheritancetype.table_per_class InheritanceType.TABLE_PER_CLASS) public class Produkt implements Serializable {... SELECT * FROM Produkt SELECT * FROM Lebensmittel SELECT * FROM Buch 228

89 Software-Architektur sinnvoll: Datenzugriff kapseln typisch mehrere DAO-Klassen entsteht Datenzugriffskomponente 229

90 Einbindung von Bean-Validation Annotationen ermöglichen bereits Angabe bestimmter Randbedingungen klarerer Ansatz: Trennung von Beschreibung des Objektgraphen (wer mit wem) von Validierung Bean-Validation kann zusammen mit JPA genutzt werden; Anwesenheit von Validatoren wird von EntityManagern genutzt Ansatz: Wenn Daten in DB persistiert werden sollen, werden alle Validierungsregeln geprüft (nicht eher); bei Fehler wird Exception geworfen Zukunft: Standards werden noch enger verknüpft Beispiel: externe Programmierernamen beginnen mit X, müssen vorgegebene Sprachen können 230

91 Beispiel: JPA mit MrXProgrammer(sprachen={" (sprachen={"java","e Java","E", ",message message="aktuelle Sprachen") public class Mitarbeiter implements GeneratedValue(strategy = GenerationType.AUTO) private message="echter Nachname") private String OneToMany(mappedBy = "bearbeiter bearbeiter", cascade = {CascadeType.PERSIST CascadeType.PERSIST, = max=3, message=" ="max 3 Auftraege") private Set<Projektauftrag> auftraege = new ManyToMany(mappedBy = "mitarbeiter mitarbeiter", cascade = {CascadeType.PERSIST CascadeType.PERSIST, = max=2, message=" ="max 2 Rollen") private List<Rolle> rollen = new ArrayList<>(); //

92 Beispiel: JPA mit @Constraint(validatedBy = MrXProgrammer { String message() default "Moduleintrag kaputt"; Class<?>[] groups() default {; Class<? extends Payload>[] payload() default {; String[] sprachen() default {; 232

93 Beispiel: JPA mit Bean-Validation (3/5) public class MrXValidator implements ConstraintValidator<MrXProgrammer, Mitarbeiter> { private String[] muss; public void initialize(mrxprogrammer a) { muss = a.sprachen(); public boolean isvalid(mitarbeiter t, ConstraintValidatorContext cvc) { System.out.println("Pruefe fuer "+t.getname()); if(!t.getname().startswith("x")) return true; List<Rolle> rollen = t.getrollen(); for (Rolle r : rollen) for (String s : muss) if (r.getname().equals(s)) return true; return false; 233

94 Beispiel: JPA mit Bean-Validation (4/5) public void beispieldaten(){ Mitarbeiter m1 = new Mitarbeiter("XUrs XUrs"); Rolle[] r= { new Rolle("Java", 60),new Rolle("C", 50); for(int i=0;i<r.length;i r.length;i++) m1.rollehinzu(r[i]); System.out.println(m1); try { em.gettransaction(). ().begin begin(); em.persist(m1); em.gettransaction(). ().commit commit(); catch (ConstraintViolationException e) { System.out.println(e.getMessage e.getmessage()); for(constraintviolation c:e.getconstraintviolations()) System.out.println(c.getMessage c.getmessage()); if (em.gettransaction em.gettransaction(). ().isactive isactive()) em.gettransaction(). ().rollback rollback(); 0: XUrs Auftraege=[ ] Rollen=[ Java C ] Pruefe fuer XUrs 234

95 Beispiel: JPA mit Bean-Validation (5/5) public void beispieldaten(){ Mitarbeiter m1 = new Mitarbeiter("X"); Rolle[] r= { new Rolle("C++", 60),new Rolle("C", 50), new Rolle("Cobol", 70); for(int i=0;i<r.length;i r.length;i++) m1.rollehinzu(r[i]); System.out.println(m1); try { em.gettransaction(). ().begin begin(); em.persist(m1); em.gettransaction(). ().commit commit(); catch (ConstraintViolationException e) { for(constraintviolation c:e.getconstraintviolations()) System.out.println(c.getMessage c.getmessage()); if (em.gettransaction em.gettransaction(). ().isactive isactive()) em.gettransaction(). ().rollback rollback(); 0: X Auftraege=[ ] Rollen=[ C++ C Cobol ] Pruefe fuer X echter Nachname TODO: Exception tritt erst bei DB-Nutzung aktuelle Sprachen auf, sinnvoll früher max 2 Rollen 235

96 Technischer Hinweis Beispiele zeigen, dass die Version 4.2 und 4.3 der Bean Validation nicht mit EclipseLink zusammenarbeiten Lösung: Bean Validation Alpha1 (wie vorher) 236

97 Interessante weitere Features in JPA in Anfrage-Sprache Funktionen auf Datentypen z. B. SUBSTRING(String,Start,Ende) UPDATE und DELETE in Querys immer vor/nach Persistierung ausgeführte Methoden Compound Primary Keys, zusammengesetzte Schlüssel über Hilfsklassen nutzbar private ROLLEN_ID"), 237

98 Erinnerung: Eine Komponentenarchitektur-Variante Datenbank als zentrale Kommunikationsplattform Ansatz 1: alle Komponenten kennen Entitäten-Modell Ansatz 2: Datenzugriffsschicht kapselt Datenbank 238

99 Ansatz 1: Alle kennen Entitäten-Modell (1/2) Datenbank als zentrale Kommunikationsplattform Entitäten sind bekannt, jede Komponente kann zugreifen Benötigt Komponente weitere Eigenschaft einer Entität wird keine Spalte sondern Tabelle ergänzt (auch 1:1, 1:C, nutzt Primärschlüssel) Sehr einfache Architektur Sehr gut Komponenten an- und ausschaltbar Keine Benachrichtigung bei Änderungen (sichtbar beim nächsten Lesen) Stark eingeschränkte Wiederverwendbarkeit Keine echte Informationskapselung Wartbarkeit nimmt mit Systemgröße enorm ab 239

100 Ansatz 1: Alle kennen Entitäten-Modell (2/2) Beispiel: Komponenten Produktverwaltung, Bestellsystem (sieht neue Produkte und Änderungen bei nächsten Aufruf) 240

101 Ansatz 2: Kapselung mit Datenzugriffsschicht (1/2) Kein direkter Zugriff auf Tabellen Ermöglicht auch Benachrichtigungen (Observer) Zerlegung in wiederverwendbare Komponenten Unterschiedliche Varianten von Kommunikationen möglich Nutzung einer zentralen Zugriffskomponente, die DB kapselt und Observer verwaltet Nur Data Access Objects können miteinander reden Komponentenschnittstellen unabhängig von der DB Selbst gemeinsame Datenbank ist optional 241

102 Ansatz 2: Kapselung mit Datenzugriffsschicht (2/2) 242

103 Überwachungsmethoden public class GeneratedValue(strategy strategy=generationtype.auto GenerationType.AUTO) private int minr; private String name; private void p(string s){system.out.println public void prepersit() {p("prepersist public void postpersist() {p("postpersist public void preremove() {p("preremove public void postremove() {p("postremove public void preupdate() {p("preupdate public void postupdate() {p("postupdate public void postload() {p("postload postload"); // Hinweis: Rollback bei einer Runtime Exception

104 Überwachungsmethoden (2/3) public static void main(string[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory createentitymanagerfactory(" ("PrePostPU PrePostPU"); EntityManager em = emf.createentitymanager(); Mitarbeiter m = new Mitarbeiter("Olga"); prepersist Mitarbeiter m2 = new Mitarbeiter("Otto"); prepersist EntityTransaction ta = em.gettransaction(); prepersist ta.begin(); postpersist em.persist(m (m); postpersist em.persist(m2 (m2); postpersist em.persist(new Mitarbeiter("Urs")); preupdate ta.commit(); postupdate ta.begin(); Mitarbeiter mm = em.find(mitarbeiter.class Mitarbeiter.class, m.getminr()); mm.setname("anna"); em.persist(mm (mm); ta.commit(); 244

105 Überwachungsmethoden (3/3) ta.begin(); em.remove(m (m); ta.commit(); em.close(); // notwendig für neuen Kontext em = emf.createentitymanager(); for (Mitarbeiter m3 : em.createquery( "SELECT m FROM Mitarbeiter m", Mitarbeiter.class).getResultList getresultlist()) System.out.println(m3.getMinr (m3.getminr() () + ": " + m3.getname()); em.close(); emf.close(); preremove postremove postload postload 2: Otto 3: Urs 245

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

Kardinalitäten. Komponentenbasierte Software- Entwicklung. Prof. Dr. Stephan Kleuker Kardinalitäten in JPA A x 1:1 zu einem A-Objekt gehört (maximal) ein anderes B- Objekt, die jeweils zu (maximal) einem A-Objekt gehören 1:N zu einem A-Objekt gehören beliebig viele B-Objekte, die jeweils

Mehr

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

Kardinalitäten. Umsetzung unidirektional 1 : N ( 3 / 4 ) Kardinalitäten in JPA Umsetzung unidirektional 1 : N ( 1 / 4 ) A x 1:1 zu einem A-Objekt gehört (maximal) ein anderes B- Objekt, die jeweils zu (maximal) einem A-Objekt gehören 1:N zu einem A-Objekt gehören

Mehr

4. Java Persistence API (JPA)

4. Java Persistence API (JPA) 4. Java Persistence API (JPA) Problem: OO in relationale DB Idee des Persistence Mapper Einfache Entity-Klasse Lebenslauf eines Entity-Objekts Umsetzung von 1:N- und M:N-Relationen Geordnete Daten Anfragen

Mehr

Literatur. 3. Java Persistence API ( JPA)

Literatur. 3. Java Persistence API ( JPA) 3. Java Persistence API ( JPA) Problem: OO in relationale DB Idee des Persistence Mapper Einfache Entity-Klasse Lebenslauf eines Entity-Objekts Umsetzung von 1:N- und M:N-Relationen Konsistenzüberwachung

Mehr

3. Java Persistence API (JPA)

3. Java Persistence API (JPA) 3. Java Persistence API (JPA) Idee des Persistence Mapper Einfache Entity-Klasse Lebenslauf eines Entity-Objekts Umsetzung von 1:N- und M:N-Relationen Geordnete Daten Anfragen Vererbung Validierung 113

Mehr

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

Java Persistence API 2.x. crud + relationships + jp-ql Java Persistence API 2.x crud + relationships + jp-ql Grundprinzip 10.02.10 2 Problematik Man muss bei der Persistierung immer das Klassenmodell und dessen Umsetzung im Datenmodell (in der DB) berücksichtigen.

Mehr

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

Workshop Java Webentwicklung Einführung in Hibernate. Ulrich Stärk Workshop Java Webentwicklung Einführung in Hibernate Ulrich Stärk Ablauf Montag bis Donnerstag 09:00 Uhr s.t. Beginn, bis ca. 17:00 Uhr 1 Stunde Mittagspause Donnerstag Experiment Aufzeichnung der Programmiertätigkeit

Mehr

Probleme bei der Nutzung der Bean Validation in JPA

Probleme bei der Nutzung der Bean Validation in JPA Probleme bei der Nutzung der Bean Validation in JPA Die aktuelle Netbeans-Installation 6.9.1 bietet als JPA-Realisierung EclipseLink in der Version 2.0.2, die in der Zusammenarbeit mit der Referenzimplementierung

Mehr

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

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 17: 3-Schichten-Architektur 2 Universität Osnabrück 1 3 - Objektorientierte Programmierung in Java Zur Erinnerung: Aufteilung der Schichten GUI Vorlesung 17: 3-Schichten-Architektur 2 Fachkonzept Fachkonzept - Datenhaltung Datenhaltung

Mehr

Datenzugriffskomponente mit JPA 2.1

Datenzugriffskomponente mit JPA 2.1 Datenzugriffskomponente mit JPA 2.1 (Grundlagen der Java Persistence Architecture) Vladislav Faerman Gliederung Einführung Konfiguration Objekt-Relationales Mapping (ORM) mit JPA Das zentrale Konzept der

Mehr

Literatur. 4. Java Persistence API (JPA) Nutzung relationaler DB in OO-Programmen. Klassische Wege zur Verbindung SW und DB

Literatur. 4. Java Persistence API (JPA) Nutzung relationaler DB in OO-Programmen. Klassische Wege zur Verbindung SW und DB 4. Java Persistence API (JPA) Problem: OO in relationale DB Idee des Persistence Mapper Einfache Entity-Klasse Lebenslauf eines Entity-Objekts Umsetzung von 1:N- und M:N-Relationen Geordnete Daten Anfragen

Mehr

4. Java Persistence API (JPA)

4. Java Persistence API (JPA) 4. Java Persistence API (JPA) Problem: OO in relationale DB Idee des Persistence Mapper Einfache Entity-Klasse Lebenslauf eines Entity-Objekts Umsetzung von 1:N- und M:N-Relationen Geordnete Daten Anfragen

Mehr

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

Datenbankpraktikum, Gruppe F. JPA mit Hibernate. Alexander Stautner, Harald Zauner, Sascha Schreier JPA mit Hibernate Alexander Stautner, Harald Zauner, Sascha Schreier Agenda Objektrelationales Mapping JPA / Hibernate Demo # 2 Objektrelationales Mapping Objektorientierte Welt Objekte Objektidentität

Mehr

Übungsaufgabe Transaktion als Middleware

Übungsaufgabe Transaktion als Middleware Übungsaufgabe Transaktion als Middleware und Java Persistence API Client/Server Abstraktes Komponentenmodell Entscheidende Punkte Erweiterung der Invoke-Methode Context-Verwaltung Transaktionsbehandlung

Mehr

Softwareentwicklung mit Enterprise JAVA Beans

Softwareentwicklung mit Enterprise JAVA Beans Softwareentwicklung mit Enterprise JAVA Beans JPA - JAVA Persistence API Problem In JAVA-programmen arbeitet man mit Hauptspeicherobjekten. Nach Beendigung des Programmes sind diese nicht mehr vorhanden.

Mehr

Weitergehende Validierungsansätze

Weitergehende Validierungsansätze Weitergehende Validierungsansätze Zusammenfassen von Constraints @Constraint(validatedBy={) @Min(10000) @Max(99999) public @interface GueltigeMatrikelnummer {... Constraints für Parameter und Rückgabewerte

Mehr

3. Java Persistence API (JPA)

3. Java Persistence API (JPA) 3. Java Persistence API (JPA) Idee des Persistence Mapper Einfache Entity-Klasse Lebenslauf eines Entity-Objekts Umsetzung von 1:N- und M:N-Relationen Geordnete Daten Anfragen Vererbung Validierung 125

Mehr

4. Java Persistence API (JPA) Weitergehende Validierungsansätze. Literatur. Klassische Wege zur Verbindung SW und DB

4. Java Persistence API (JPA) Weitergehende Validierungsansätze. Literatur. Klassische Wege zur Verbindung SW und DB Weitergehende Validierungsansätze Zusammenfassen von Constraints @Constraint(validatedBy={) @Min(10000) @Max(99999) public @interface GueltigeMatrikelnummer {... Constraints für Parameter und Rückgabewerte

Mehr

Einführung in die Programmierung

Einführung in die Programmierung Technische Universität München WS 2003/2004 Institut für Informatik Prof. Dr. Christoph Zenger Testklausur Einführung in die Programmierung Probeklausur Java (Lösungsvorschlag) 1 Die Klasse ArrayList In

Mehr

Java: Vererbung. Teil 3: super() www.informatikzentrale.de

Java: Vererbung. Teil 3: super() www.informatikzentrale.de Java: Vererbung Teil 3: super() Konstruktor und Vererbung Kindklasse ruft SELBSTSTÄNDIG und IMMER zuerst den Konstruktor der Elternklasse auf! Konstruktor und Vererbung Kindklasse ruft SELBSTSTÄNDIG und

Mehr

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

Session Beans & Servlet Integration. Ralf Gitzel ralf_gitzel@hotmail.de s & Servlet Integration Ralf Gitzel ralf_gitzel@hotmail.de 1 Themenübersicht Ralf Gitzel ralf_gitzel@hotmail.de 2 Übersicht Motivation Das Interface Stateful und Stateless s Programmierung einer Stateful

Mehr

Datenmanagement in Android-Apps. 16. Mai 2013

Datenmanagement in Android-Apps. 16. Mai 2013 Datenmanagement in Android-Apps 16. Mai 2013 Überblick Strukturierung von datenorientierten Android-Apps Schichtenarchitektur Möglichkeiten der Datenhaltung: in Dateien, die auf der SDCard liegen in einer

Mehr

Java Einführung Collections

Java Einführung Collections Java Einführung Collections Inhalt dieser Einheit Behälterklassen, die in der Java API bereitgestellt werden Wiederholung Array Collections (Vector, List, Set) Map 2 Wiederholung Array a[0] a[1] a[2] a[3]...

Mehr

Software Engineering Klassendiagramme Assoziationen

Software Engineering Klassendiagramme Assoziationen Software Engineering Klassendiagramme Assoziationen Prof. Adrian A. Müller, PMP, PSM 1, CSM Fachbereich Informatik und Mikrosystemtechnik 1 Lesen von Multiplizitäten (1) Multiplizitäten werden folgendermaßen

Mehr

Programmieren in Java

Programmieren in Java Programmieren in Java objektorientierte Programmierung 2 2 Zusammenhang Klasse-Datei In jeder *.java Datei kann es genau eine public-klasse geben wobei Klassen- und Dateiname übereinstimmen. Es können

Mehr

Ein Ausflug zu ACCESS

Ein Ausflug zu ACCESS Ein Ausflug zu ACCESS Die folgenden Folien zeigen beispielhaft, wie man sein DB- Wissen auf ACCESS übertragen kann betrachtet wird ACCESS 2002, da gerade im Bereich der Nutzung von SQL hier einiges nachgearbeitet

Mehr

Java Persistence API. Phillip Ghadir Oliver Tigges

Java Persistence API. Phillip Ghadir Oliver Tigges Phillip Ghadir phillip.ghadir@innoq.com Oliver Tigges oliver.tigges@gmx.de Was wissen Sie in 45 Minuten? Wie man mit JPA entwickelt. Dass wir viele Eigenschaften von JPA ausgelassen haben. Dass Sie nicht

Mehr

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

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 16: 3-Schichten-Architektur 1 Fachkonzept - GUI Universität Osnabrück Drei-Schichten-Architektur 3 - Objektorientierte Programmierung in Java Vorlesung 6: 3-Schichten-Architektur Fachkonzept - GUI SS 2005 Prof. Dr. F.M. Thiesing, FH Dortmund Ein großer

Mehr

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

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {... PIWIN I Kap. 8 Objektorientierte Programmierung - Vererbung 31 Schlüsselwort: final Verhindert, dass eine Methode überschrieben wird public final int holekontostand() {... Erben von einer Klasse verbieten:

Mehr

5. Java Persistence API (JPA)

5. Java Persistence API (JPA) 5. Java Persistence API (JPA) Idee des Persistence Mapper Einfache Entity-Klasse Lebenslauf eines Entity-Objekts Umsetzung von 1:N- und M:N-Relationen Geordnete Daten Anfragen Vererbung Validierung 218

Mehr

Objektorientierte Programmierung

Objektorientierte Programmierung Universität der Bundeswehr Fakultät für Informatik Institut 2 Priv.-Doz. Dr. Lothar Schmitz FT 2006 Zusatzaufgaben Lösungsvorschlag Objektorientierte Programmierung Lösung 22 (Java und UML-Klassendiagramm)

Mehr

Objektorientierte Programmierung. Kapitel 12: Interfaces

Objektorientierte Programmierung. Kapitel 12: Interfaces 12. Interfaces 1/14 Objektorientierte Programmierung Kapitel 12: Interfaces Stefan Brass Martin-Luther-Universität Halle-Wittenberg Wintersemester 2012/13 http://www.informatik.uni-halle.de/ brass/oop12/

Mehr

Beispiel: DB-Mock (1/7)

Beispiel: DB-Mock (1/7) Beispiel: DB-Mock (1/7) Aufgabe: DB, auf die vereinfachend nur lesend zugeriffen wird mocken warum: benötigte keine DB-Lizenz, garantiert gleiche Werte ohne aufwändiges reset, kein Zeitverlust durch Verbindungsaufbau

Mehr

Objektorientierte Programmierung

Objektorientierte Programmierung Objektorientierte Programmierung 1 Geschichte Dahl, Nygaard: Simula 67 (Algol 60 + Objektorientierung) Kay et al.: Smalltalk (erste rein-objektorientierte Sprache) Object Pascal, Objective C, C++ (wiederum

Mehr

Große Übung Praktische Informatik 1

Große Übung Praktische Informatik 1 Große Übung Praktische Informatik 1 2005-12-08 fuessler@informatik.uni-mannheim.de http://www.informatik.uni-mannheim.de/pi4/people/fuessler 1: Announcements / Orga Weihnachtsklausur zählt als Übungsblatt,

Mehr

DATENBANKEN SQL UND SQLITE VON MELANIE SCHLIEBENER

DATENBANKEN SQL UND SQLITE VON MELANIE SCHLIEBENER DATENBANKEN SQL UND SQLITE VON MELANIE SCHLIEBENER INHALTSVERZEICHNIS 1. Datenbanken 2. SQL 1.1 Sinn und Zweck 1.2 Definition 1.3 Modelle 1.4 Relationales Datenbankmodell 2.1 Definition 2.2 Befehle 3.

Mehr

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

Java Kurs für Anfänger Einheit 4 Klassen und Objekte Java Kurs für Anfänger Einheit 4 Klassen und Ludwig-Maximilians-Universität München (Institut für Informatik: Programmierung und Softwaretechnik von Prof.Wirsing) 13. Juni 2009 Inhaltsverzeichnis klasse

Mehr

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

Persistenz von Objekten relationale Datenbank Eigene Datenstruktur XML (JAXB) Proprietäre Dateiformate (Lochkarten) Persistenz von Objekten relationale Datenbank Eigene Datenstruktur XML (JAXB) Proprietäre Dateiformate (Lochkarten) O/R Mapping - Objekte (Attribute) - 1:1, 1:n, n:m Beziehungen - Vererbungen (- Interfaces)

Mehr

Prinzipien Objektorientierter Programmierung

Prinzipien Objektorientierter Programmierung Prinzipien Objektorientierter Programmierung Valerian Wintner Inhaltsverzeichnis 1 Vorwort 1 2 Kapselung 1 3 Polymorphie 2 3.1 Dynamische Polymorphie...................... 2 3.2 Statische Polymorphie........................

Mehr

Einführung in Java. PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005

Einführung in Java. PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005 Einführung in Java PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005 Gliederung 1. Was ist Java / Geschichte von Java 2. Prinzip der Plattformunabhängigkeit 3. Wie kommt man vom Quellcode zum Programm

Mehr

Client-Server-Beziehungen

Client-Server-Beziehungen Client-Server-Beziehungen Server bietet Dienste an, Client nutzt Dienste Objekt ist gleichzeitig Client und Server Vertrag zwischen Client und Server: Client erfüllt Vorbedingungen eines Dienstes Server

Mehr

Software Engineering Klassendiagramme Einführung

Software Engineering Klassendiagramme Einführung Software Engineering Klassendiagramme Einführung Prof. Adrian A. Müller, PMP, PSM 1, CSM Fachbereich Informatik und Mikrosystemtechnik 1 Aufgabe Erstellen Sie eine Klasse Person in Java. Jede Person verfügt

Mehr

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005 Einführung in die objektorientierte Programmierung mit Java Klausur am 19. Oktober 2005 Matrikelnummer: Nachname: Vorname: Semesteranzahl: Die Klausur besteht aus drei Frageblöcken zu den Inhalten der

Mehr

Vermeiden Sie es sich bei einer deutlich erfahreneren Person "dranzuhängen", Sie sind persönlich verantwortlich für Ihren Lernerfolg.

Vermeiden Sie es sich bei einer deutlich erfahreneren Person dranzuhängen, Sie sind persönlich verantwortlich für Ihren Lernerfolg. 1 2 3 4 Vermeiden Sie es sich bei einer deutlich erfahreneren Person "dranzuhängen", Sie sind persönlich verantwortlich für Ihren Lernerfolg. Gerade beim Einstig in der Programmierung muss kontinuierlich

Mehr

Einführung in die Java- Programmierung

Einführung in die Java- Programmierung Einführung in die Java- Programmierung Dr. Volker Riediger Tassilo Horn riediger horn@uni-koblenz.de WiSe 2012/13 1 Wichtig... Mittags keine Pommes... Praktikum A 230 C 207 (Madeleine + Esma) F 112 F 113

Mehr

Oracle: Abstrakte Datentypen:

Oracle: Abstrakte Datentypen: Oracle: Abstrakte Datentypen: Oracle bietet zwei mögliche Arten um abstrakte Datentypen zu implementieren: Varying Array Nested Table Varying Array (kunde) kdnr kdname gekaufteart 1 Mustermann 1 4 5 8

Mehr

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java: Technische Informatik für Ingenieure (TIfI) WS 2005/2006, Vorlesung 9 II. Grundlagen der Programmierung Ekkart Kindler Funktionen und Prozeduren Datenstrukturen 9. Datenstrukturen Daten zusammenfassen

Mehr

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

Übung 1 mit C# 6.0 MATTHIAS RONCORONI Übung 1 mit C# 6.0 MATTHIAS RONCORONI Inhalt 2 1. Überblick über C# 2. Lösung der Übung 1 3. Code 4. Demo C# allgemein 3 aktuell: C# 6.0 mit.net-framework 4.6: Multiparadigmatisch (Strukturiert, Objektorientiert,

Mehr

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

Inhaltsverzeichnis. Bernd Müller, Harald Wehr. Java Persistence API 2. Hibernate, EclipseLink, OpenJPA und Erweiterungen ISBN: Inhaltsverzeichnis Bernd Müller, Harald Wehr Java Persistence API 2 Hibernate, EclipseLink, OpenJPA und Erweiterungen ISBN: 978-3-446-42693-1 Weitere Informationen oder Bestellungen unter http://www.hanser.de/978-3-446-42693-1

Mehr

Innere Klassen in Java

Innere Klassen in Java Innere Klassen in Java SS 2012 Prof. Dr. Margarita Esponda Innere Klassen Klassen- oder Interfacedefinitionen können zur besseren Strukturierung von Programmen verschachtelt werden Eine "Inner Class" wird

Mehr

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

OR-Mapping. WS2008/2009 DBIS/Dr. Karsten Tolle OR-Mapping Zwei Paradigmen treffen aufeinander Gegensätze OO vs. Relational: Stichwort: O/R Impedance Mismatch Person Tabellen mit Schlüssel und Fremdschlusselbeziehungen. Abt-Nr. beschäftigt Pk-Nr Name

Mehr

Javakurs zu Informatik I. Henning Heitkötter

Javakurs zu Informatik I. Henning Heitkötter Javakurs zu Informatik I Arrays vergleichen Implementieren Sie folgende Methode, die prüft, ob die Elemente der beiden Arrays an jeder Position übereinstimmen: public static boolean identisch(int[] a,

Mehr

Nathan Burgener. Design by Contract. Modul SWE

Nathan Burgener. Design by Contract. Modul SWE NathanBurgener DesignbyContract ModulSWE NathanBurgener Inhaltsverzeichnis 1 WasistDesignbyContract...3 1.1 Überblick...3 1.2 DesignbyContractmitMethoden...4 1.3 DesignbyContractmitKlassen...5 1.4 Vererbung...6

Mehr

Vorkurs C++ Programmierung

Vorkurs C++ Programmierung Vorkurs C++ Programmierung Klassen Letzte Stunde Speicherverwaltung automatische Speicherverwaltung auf dem Stack dynamische Speicherverwaltung auf dem Heap new/new[] und delete/delete[] Speicherklassen:

Mehr

Java Kurs für Anfänger Einheit 5 Methoden

Java Kurs für Anfänger Einheit 5 Methoden Java Kurs für Anfänger Einheit 5 Methoden Ludwig-Maximilians-Universität München (Institut für Informatik: Programmierung und Softwaretechnik von Prof.Wirsing) 22. Juni 2009 Inhaltsverzeichnis Methoden

Mehr

EJB Beispiel. JEE Vorlesung 10. Ralf Gitzel ralf_gitzel@hotmail.de

EJB Beispiel. JEE Vorlesung 10. Ralf Gitzel ralf_gitzel@hotmail.de EJB Beispiel JEE Vorlesung 10 Ralf Gitzel ralf_gitzel@hotmail.de 1 Stundenkonzept Gemeinsame Übung Stoff der letzten Stunde wird gemeinsam in einem Beispiel umgesetzt Details werden nochmals erklärt bzw.

Mehr

SEP 114. Design by Contract

SEP 114. Design by Contract Design by Contract SEP 114 Design by Contract Teile das zu entwickelnde Programm in kleine Einheiten (Klassen, Methoden), die unabhängig voneinander entwickelt und überprüft werden können. Einheiten mit

Mehr

Klausur zur Einführung in die objektorientierte Programmierung mit Java

Klausur zur Einführung in die objektorientierte Programmierung mit Java Klausur zur Einführung in die objektorientierte Programmierung mit Java im Studiengang Informationswissenschaft Prof. Dr. Christian Wolff Professur für Medieninformatik Institut für Medien-, Informations-

Mehr

Programmieren I. Strategie zum Entwurf von Klassen. Beispiele. Design von Klassen. Dr. Klaus Höppner. Beispiel: Bibliothek

Programmieren I. Strategie zum Entwurf von Klassen. Beispiele. Design von Klassen. Dr. Klaus Höppner. Beispiel: Bibliothek Programmieren I Dr. Klaus Höppner Hochschule Darmstadt Wintersemester 2008/2009 1 / 22 2 / 22 Strategie zum Entwurf von Klassen Beispiele Objektorientierte Sichtweise: Mit welchen Objekten habe ich es

Mehr

Willkommen zur Vorlesung. Objektorientierte Programmierung Vertiefung - Java

Willkommen zur Vorlesung. Objektorientierte Programmierung Vertiefung - Java Willkommen zur Vorlesung Objektorientierte Programmierung Vertiefung - Java Zum Dozenten Mein Name: Andreas Berndt Diplom-Informatiker (TU Darmstadt) Derzeit Software-Entwickler für Web- Applikationen

Mehr

Dieses Tutorial gibt eine Übersicht der Form Klassen von Struts, welche Besonderheiten und Unterschiede diese aufweisen.

Dieses Tutorial gibt eine Übersicht der Form Klassen von Struts, welche Besonderheiten und Unterschiede diese aufweisen. Übersicht Struts Forms Dieses Tutorial gibt eine Übersicht der Form Klassen von Struts, welche Besonderheiten und Unterschiede diese aufweisen. Allgemeines Autor: Sascha Wolski http://www.laliluna.de/tutorials.html

Mehr

Objektorientierte Programmierung

Objektorientierte Programmierung Universität der Bundeswehr Fakultät für Informatik Institut 2 Priv.-Doz. Dr. Lothar Schmitz FT 2006 Übungsblatt 5 Lösungsvorschlag Objektorientierte Programmierung 22. 05. 2006 Lösung 9 (SMS-Eingabe am

Mehr

Labor 3 - Datenbank mit MySQL

Labor 3 - Datenbank mit MySQL Labor 3 - Datenbank mit MySQL Hinweis: Dieses Labor entstand z.t. aus Scripten von Prof. Dr. U. Bannier. 1. Starten des MySQL-Systems MySQL ist ein unter www.mysql.com kostenlos erhältliches Datenbankmanagementsystem.

Mehr

Gregor Raschke 2008 HIBERNATE. Eine Einführung

Gregor Raschke 2008 HIBERNATE. Eine Einführung 1 HIBERNATE Eine Einführung Inhalt 2 Einleitung Beispielkonfiguration Die hibernate.cfg.xml Eine Beispieltransaktion Abfragemöglichkeiten JPA und Hibernate Ressourcen und Quellen Einleitung (1) - Geschichtliches

Mehr

Kapitel 6. Vererbung

Kapitel 6. Vererbung Kapitel 6 Vererbung Vererbung 1 Ziele Das Vererbungsprinzip der objektorientierten Programmierung verstehen Und in Java umsetzen können Insbesondere folgende Begriffe verstehen und anwenden können: Ober/Unterklassen

Mehr

SQL für Trolle. mag.e. Dienstag, 10.2.2009. Qt-Seminar

SQL für Trolle. mag.e. Dienstag, 10.2.2009. Qt-Seminar Qt-Seminar Dienstag, 10.2.2009 SQL ist......die Abkürzung für Structured Query Language (früher sequel für Structured English Query Language )...ein ISO und ANSI Standard (aktuell SQL:2008)...eine Befehls-

Mehr

188.154 Einführung in die Programmierung für Wirtschaftsinformatik

188.154 Einführung in die Programmierung für Wirtschaftsinformatik Beispiel 1 Vererbung (Liste) Gegeben sind die beiden Klassen ListNode und PersonNode. 188.154 Einführung in die Programmierung für Wirtschaftsinformatik Wiederholung, Prüfungsvorbereitung Monika Lanzenberger

Mehr

Enterprise JavaBeans Überblick

Enterprise JavaBeans Überblick Enterprise JavaBeans Überblick 1. Überblick Java EE 5 und Komponententechnologien 2. Einführung Java EE 5 Plattform 3. Enterprise JavaBeans Architektur 4. Ressourcen Management und Primäre Services 6.

Mehr

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden.

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden. Einfache Ein- und Ausgabe mit Java 1. Hallo-Welt! Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden. /** Die Klasse hello sendet einen

Mehr

Datenbanken SQL Einführung Datenbank in MySQL einrichten mit PhpMyAdmin

Datenbanken SQL Einführung Datenbank in MySQL einrichten mit PhpMyAdmin Datenbanken SQL Einführung Datenbank in MySQL einrichten mit PhpMyAdmin PhpMyAdmin = grafsches Tool zur Verwaltung von MySQL-Datenbanken Datenbanken erzeugen und löschen Tabellen und Spalten einfügen,

Mehr

Jetzt sollt ihr von der Vorlage der Grundversion 1.0 ein eigenes Textadventure erstellen.

Jetzt sollt ihr von der Vorlage der Grundversion 1.0 ein eigenes Textadventure erstellen. Teil B: Erweiterungen Jetzt sollt ihr von der Vorlage der Grundversion 1.0 ein eigenes Textadventure erstellen. Die folgenden Aufgaben und Ausführungen geben einige Hilfestellungen, welche (mindestens

Mehr

Assoziation und Aggregation

Assoziation und Aggregation Assoziation und Aggregation Martin Wirsing in Zusammenarbeit mit Matthias Hölzl, Nora Koch 05/03 2 Ziele Verstehen der Begriffe Assoziation und Aggregation Implementierung von Assoziationen in Java schreiben

Mehr

Whitepaper. Produkt: combit Relationship Manager. Datensatzhistorie mit dem SQL Server 2000 und 2005. combit GmbH Untere Laube 30 78462 Konstanz

Whitepaper. Produkt: combit Relationship Manager. Datensatzhistorie mit dem SQL Server 2000 und 2005. combit GmbH Untere Laube 30 78462 Konstanz combit GmbH Untere Laube 30 78462 Konstanz Whitepaper Produkt: combit Relationship Manager Datensatzhistorie mit dem SQL Server 2000 und 2005 Datensatzhistorie mit dem SQL Server 2000 und 2005-2 - Inhalt

Mehr

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

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala Das Typsystem von Scala 1 Eigenschaften Das Typsystem von Scala ist statisch, implizit und sicher 2 Nichts Primitives Alles ist ein Objekt, es gibt keine primitiven Datentypen scala> 42.hashCode() res0:

Mehr

JDBC. Es kann z.b. eine ODBC-Treiberverbindung eingerichtet werden, damit das JAVA-Programm auf eine ACCESS-DB zugreifen kann.

JDBC. Es kann z.b. eine ODBC-Treiberverbindung eingerichtet werden, damit das JAVA-Programm auf eine ACCESS-DB zugreifen kann. JDBC in 5 Schritten JDBC (Java Database Connectivity) ist eine Sammlung von Klassen und Schnittstellen, mit deren Hilfe man Verbindungen zwischen Javaprogrammen und Datenbanken herstellen kann. 1 Einrichten

Mehr

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

Java Einführung Umsetzung von Beziehungen zwischen Klassen. Kapitel 7 Java Einführung Umsetzung von Beziehungen zwischen Klassen Kapitel 7 Inhalt Wiederholung: Klassendiagramm in UML Java-Umsetzung von Generalisierung Komposition Assoziationen 2 Das Klassendiagramm Zweck

Mehr

Javakurs 2013 Objektorientierung

Javakurs 2013 Objektorientierung Javakurs 2013 Objektorientierung Objektorientierte Programmierung I Armelle Vérité 7 März 2013 Technische Universität Berlin This work is licensed under the Creative Commons Attribution-ShareAlike 3.0

Mehr

Programmierkurs Java

Programmierkurs Java Programmierkurs Java Dr. Dietrich Boles Aufgaben zu UE16-Rekursion (Stand 09.12.2011) Aufgabe 1: Implementieren Sie in Java ein Programm, das solange einzelne Zeichen vom Terminal einliest, bis ein #-Zeichen

Mehr

Relationales Modell: SQL-DDL. SQL als Definitionssprache. 7. Datenbankdefinitionssprachen. Anforderungen an eine relationale DDL

Relationales Modell: SQL-DDL. SQL als Definitionssprache. 7. Datenbankdefinitionssprachen. Anforderungen an eine relationale DDL Relationales Modell: SQLDDL SQL als Definitionssprache SQLDDL umfaßt alle Klauseln von SQL, die mit Definition von Typen Wertebereichen Relationenschemata Integritätsbedingungen zu tun haben Externe Ebene

Mehr

desk.modul : WaWi- Export

desk.modul : WaWi- Export desk.modul : WaWi- Export Die Schnittstelle besteht aus einem Programm, welches die Daten aus der OfficeLine ausliest und in eine XML-Datei exportiert. Die Schnittstelle ist als ein eigenständiges Programm

Mehr

KURZANLEITUNG CYBERDUCK MIT CLOUD OBJECT STORAGE

KURZANLEITUNG CYBERDUCK MIT CLOUD OBJECT STORAGE KURZANLEITUNG CYBERDUCK MIT CLOUD OBJECT STORAGE Version 1.12 01.07.2014 SEITE _ 2 INHALTSVERZEICHNIS 1. Einleitung...Seite 03 2. Zugriff auf Cloud Object Storage mit Cyberduck...Seite 04 3. Neuen Container

Mehr

Distributed Computing Group

Distributed Computing Group JAVA TUTORIAL Distributed Computing Group Vernetzte Systeme - SS 06 Übersicht Warum Java? Interoperabilität grosse und gut dokumentierte Library weit verbreitet Syntax sehr nahe an C Erfahrung: Java wird

Mehr

Objektorientierte Programmierung OOP

Objektorientierte Programmierung OOP Objektorientierte Programmierung OOP Objektorientierte Programmierung OOP Ronja Düffel WS2012/13 08. Oktober 2013 Objektorientierte Programmierung OOP Objektorientierte Programmierung Objektorientierte

Mehr

3. Stored Procedures und PL/SQL

3. Stored Procedures und PL/SQL 3. Stored Procedures und PL/SQL Wenn eine Anwendung auf einer Client-Maschine läuft, wird normalerweise jede SQL-Anweisung einzeln vom Client an den Server gesandt, und jedes Ergebnistupel wird einzeln

Mehr

Testen mit JUnit. Motivation

Testen mit JUnit. Motivation Test First Design for Test in Eclipse (eigentlich: ) zu einer Klasse Beispiel zur Demonstration Ergänzungen Test First "Immer dann, wenn Du in Versuchung kommst, etwas wie eine print- Anweisung oder einen

Mehr

mit Musterlösungen Prof. Dr. Gerd Stumme, Dipl.-Inform. Christoph Schmitz 11. Juni 2007

mit Musterlösungen Prof. Dr. Gerd Stumme, Dipl.-Inform. Christoph Schmitz 11. Juni 2007 6. Übung zur Vorlesung Datenbanken im Sommersemester 2007 mit Musterlösungen Prof. Dr. Gerd Stumme, Dipl.-Inform. Christoph Schmitz 11. Juni 2007 Aufgabe 1: Rekursion Betrachten Sie die folgende Tabelle

Mehr

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

Handbuch ECDL 2003 Basic Modul 5: Datenbank Grundlagen von relationalen Datenbanken Handbuch ECDL 2003 Basic Modul 5: Datenbank Grundlagen von relationalen Datenbanken Dateiname: ecdl5_01_00_documentation_standard.doc Speicherdatum: 14.02.2005 ECDL 2003 Basic Modul 5 Datenbank - Grundlagen

Mehr

Fachdidaktik der Informatik 18.12.08 Jörg Depner, Kathrin Gaißer

Fachdidaktik der Informatik 18.12.08 Jörg Depner, Kathrin Gaißer Fachdidaktik der Informatik 18.12.08 Jörg Depner, Kathrin Gaißer Klassendiagramme Ein Klassendiagramm dient in der objektorientierten Softwareentwicklung zur Darstellung von Klassen und den Beziehungen,

Mehr

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck Javadoc Programmiermethodik Eva Zangerle Universität Innsbruck Überblick Einführung Java Ein erster Überblick Objektorientierung Vererbung und Polymorphismus Ausnahmebehandlung Pakete und Javadoc Spezielle

Mehr

Java Database Connectivity (JDBC) 14.07.2009 Walther Rathenau Gewerbeschule 1

Java Database Connectivity (JDBC) 14.07.2009 Walther Rathenau Gewerbeschule 1 Java Database Connectivity (JDBC) 14.07.2009 Walther Rathenau Gewerbeschule 1 Was ist JDBC? Hauptsächlich eine Sammlung von Java Klassen und Schnittstellen für eine einfache Verbindung von Java Programmen

Mehr

Übungen zur Softwaretechnik

Übungen zur Softwaretechnik Technische Universität München Fakultät für Informatik Lehrstuhl IV: Software & Systems Engineering Markus Pister, Dr. Bernhard Rumpe WS 2002/2003 Lösungsblatt 9 17. Dezember 2002 www4.in.tum.de/~rumpe/se

Mehr

Fachbericht zum Thema: Anforderungen an ein Datenbanksystem

Fachbericht zum Thema: Anforderungen an ein Datenbanksystem Fachbericht zum Thema: Anforderungen an ein Datenbanksystem von André Franken 1 Inhaltsverzeichnis 1 Inhaltsverzeichnis 1 2 Einführung 2 2.1 Gründe für den Einsatz von DB-Systemen 2 2.2 Definition: Datenbank

Mehr

Grundlagen von Python

Grundlagen von Python Einführung in Python Grundlagen von Python Felix Döring, Felix Wittwer November 17, 2015 Scriptcharakter Programmierparadigmen Imperatives Programmieren Das Scoping Problem Objektorientiertes Programmieren

Mehr

5.2 Neue Projekte erstellen

5.2 Neue Projekte erstellen 5.2 Neue Projekte erstellen Das Bearbeiten von bestehenden Projekten und Objekten ist ja nicht schlecht wie aber können Sie neue Objekte hinzufügen oder gar völlig neue Projekte erstellen? Die Antwort

Mehr

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6 Gudrun Fischer Sascha Kriewel programmierung@is.informatik.uni-duisburg.de Anmeldung zur Klausur! Übungsblatt Nr. 6 Um an der Klausur teilzunehmen, müssen sich Studierende der angewandten Informatik in

Mehr

Musterlösungen zur Klausur Informatik 3

Musterlösungen zur Klausur Informatik 3 Musterlösungen zur Klausur Informatik 3 Justus-Liebig-Universität Gießen Wintersemester 2003/2004 Aufgabe 1 (6 Punkte) Man kreuze bei den folgenden Deklarationen und Definitionen jeweils an, ob sie aus

Mehr

Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim www.oio.de info@oio.de Version: 2014 Orientation 1.0 in Objects GmbH Der Sprecher Erik Bamberg (OIO) 2 1 s Aufgaben des Cachings Datenbank

Mehr

7. Übung - Datenbanken

7. Übung - Datenbanken 7. Übung - Datenbanken Informatik I für Verkehrsingenieure Aufgaben inkl. Beispiellösungen 1. Aufgabe: DBS a Was ist die Kernaufgabe von Datenbanksystemen? b Beschreiben Sie kurz die Abstraktionsebenen

Mehr

seit Java 1.1 Bestandteil der API: packages java.sql, javax.sql

seit Java 1.1 Bestandteil der API: packages java.sql, javax.sql JDBC inoffizielle Abkürzung für: Java Database Connectivity seit Java 1.1 Bestandteil der API: packages java.sql, javax.sql ist eine Menge von Klassen und Methoden, um aus Java-Programmen relationale Datenbanken

Mehr