4. Java Persistence API (JPA)
|
|
- Linus Waltz
- vor 8 Jahren
- Abrufe
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 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
MehrKardinalitä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
Mehr4. 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
MehrLiteratur. 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
Mehr3. 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
MehrJava 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.
MehrWorkshop 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
MehrProbleme 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
MehrDrei-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
MehrDatenzugriffskomponente 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
MehrLiteratur. 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
Mehr4. 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
MehrDatenbankpraktikum, 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 und Java Persistence API Client/Server Abstraktes Komponentenmodell Entscheidende Punkte Erweiterung der Invoke-Methode Context-Verwaltung Transaktionsbehandlung
MehrSoftwareentwicklung 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.
MehrWeitergehende Validierungsansätze
Weitergehende Validierungsansätze Zusammenfassen von Constraints @Constraint(validatedBy={) @Min(10000) @Max(99999) public @interface GueltigeMatrikelnummer {... Constraints für Parameter und Rückgabewerte
Mehr3. 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
Mehr4. 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
MehrEinfü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
MehrJava: 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
MehrSession 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
MehrDatenmanagement 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
MehrJava 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]...
MehrSoftware 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
MehrProgrammieren 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
MehrEin 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
MehrJava 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
MehrDrei-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
MehrVerhindert, 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:
Mehr5. 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
MehrObjektorientierte 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)
MehrObjektorientierte 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/
MehrBeispiel: 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
MehrObjektorientierte 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
MehrGroß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,
MehrDATENBANKEN 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.
MehrJava 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
MehrPersistenz 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)
MehrPrinzipien 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........................
MehrEinfü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
MehrClient-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
MehrSoftware 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
MehrEinfü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
MehrVermeiden 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
MehrEinfü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
MehrOracle: 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
MehrII. 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 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,
MehrInhaltsverzeichnis. 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
MehrInnere 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
MehrOR-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
MehrJavakurs 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,
MehrNathan 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
MehrVorkurs 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:
MehrJava 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
MehrEJB 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.
MehrSEP 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
MehrKlausur 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-
MehrProgrammieren 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
MehrWillkommen 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
MehrDieses 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
MehrObjektorientierte 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
MehrLabor 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.
MehrGregor 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
MehrKapitel 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
MehrSQL 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-
Mehr188.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
MehrEnterprise 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.
MehrDas 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
MehrDatenbanken 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,
MehrJetzt 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
MehrAssoziation 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
MehrWhitepaper. 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
MehrDas 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:
MehrJDBC. 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
MehrJava 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
MehrJavakurs 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
MehrProgrammierkurs 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
MehrRelationales 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
Mehrdesk.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
MehrKURZANLEITUNG 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
MehrDistributed 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
MehrObjektorientierte Programmierung OOP
Objektorientierte Programmierung OOP Objektorientierte Programmierung OOP Ronja Düffel WS2012/13 08. Oktober 2013 Objektorientierte Programmierung OOP Objektorientierte Programmierung Objektorientierte
Mehr3. 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
MehrTesten 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
Mehrmit 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
MehrHandbuch 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
MehrFachdidaktik 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,
MehrJavadoc. 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
MehrJava 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
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
MehrFachbericht 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
MehrGrundlagen 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
Mehr5.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
MehrFachgebiet 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
MehrMusterlö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
MehrOrientation 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
Mehr7. Ü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
Mehrseit 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