1 Objektrelationale Abbildung am Beispiel von Hibernate Folien und Beispiele (*) unter http://claus-brell.de/orm (IP-Adresse wird gespeichert) Mai 2011 Dr. rer. nat. Claus Brell (*) Eclipse Projekte (Quelltexte) zu PersonenRegister und YellowPages, SQL-Create für YellowPages, alle Vortragsfolien. Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 2 Perspektive Java Experte -Effizienzverbesserung -Unterschiedliche Plattformen -Reengeneering-Projekte -Wiederkehrende DB-Aufgaben Pfadfinder -Wahl der geeigneten Technik -Kennenlernen neuer Möglichkeiten -Orientierung… Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 1 3 Überblick 1. Motivation, Beispiel 2. Warum Objektorientierung und Relationale DB 3. Warum Hibernate (… und was ist das) 4. Beispielimplementierung 5. Fazit und kritische Betrachtung 6. Tipps zum Weiterspielen Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 1 Motivation, Beispiel Kundendaten der KKB-Bank 4 ! 1989 KKB-Bank 1 Mio. Kundendatensätze IBM 3090, RDBMS: DB2, PL1 Mission: Daten sollen erhalten bleiben Anwendung soll Online-Anwendung werden (LU2…Internet) heute KKB-Bank heißt Citibank Rechenzentrum ist nicht mehr in Meerbusch Die Datensätze sind immer noch da… Folgerung Anwendungen sind kurzlebig. Daten sind langlebig (Datenhaltungssysteme auch) weiteres Beispiel: NRW-Landesdatenbank des statistischen Landesamtes Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 2 5 1 Motivation, Beispiel Bedarf Ein immer wiederkehrender Bedarf: „Alte“ Datenbestände und bewährte Datenhaltungssysteme sollen beibehalten und Anwendungen modernisiert werden. => Reengeneering Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 1 Motivation, Beispiel …ein einfaches, erweiterbares Beispiel 6 ! Kundendatenbank eines Kreditinstitutes komplex. ⇒einfaches, aber umfassendes „Musterbeispiel“ Problem ??? kennt: ……. kann: ……. Kommunikation ⇒Yellow Pages (Informationssystem zum Finden von Personen mit Kenntnissen) Firmeninternes Adressbuch mit Namen und Kompetenzen. heute: typischer Kandidat für Web 2.0 Anwendung Anwendungsbeispiel kann sofort in Bilderdatenbank (Bilder mit Tags und Kategorien) abgewandelt werden. => generisches Muster für social-tagging-Projekte => Paradebeispiel für Objektrelationale Abbildung Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 3 2 Warum Objektorientierung und Relationale DB Yellow Pages Lösung in Excel 7 Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 2 Warum Objektorientierung und Relationale DB Excel-Lösung: Implementierung und Nachteile Office PC Office PC Office PC FirmenIntranet 8 Datei Server Yellow Pages.xls Nachteile: - Datei gesperrt bei konkurrierendem Zugriff - jeder Arbeitsplatz benötigt Excel - jeder Nutzer benötigt Excel-Kenntnisse Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 4 2 Warum Objektorientierung und Relationale DB Web-Lösung (ISLite) + Excel 9 Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 2 Warum Objektorientierung und Relationale DB Implementierung ISLite + Excel, Nachteile Browser Browser Office PC FirmenIntranet 10 Web Server ISLite.php Yellow Pages.xls Nachteil: - Nicht alle können Kompetenzen und Personen eintragen Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 5 2 Warum Objektorientierung und Relationale DB Implementierung Web-Programm + RDBMS Browser 11 Webserver Browser Yellow-Pages Anwendung(*) FirmenIntranet RDBMS RDBMS-Tabellen Vorteil: bis auf Anwendung(*) Standardkomponenten. RDBMS speichert Daten und Beziehungen zwischen den Daten in Tabellen. RDBMS bietet standardisierte Abfragesprache (SQL). (kleiner) Nachteil: bei komplexerer Datenbank und Datenmodelländerungen: Anwendungsänderung aufwändig. Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 2 Warum Objektorientierung und Relationale DB Details Web-Programm + RDBMS 12 Webserver: Apache, MS-IIS, Tomcat CGI, Apache-Modul … Yellow-Pages Anwendung: C, C#, C++, Perl, PHP, Python, Java SQL RDBMS: MS-SQL-Server, DB2, Oracle, MySQL, SQLite RDBMS-Tabellen Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 6 2 Warum Objektorientierung und Relationale DB RDBMS: ER-Modell für Yellow-Pages (1) Personen 13 ! Kompetenzen Liste der Kompetenzen: 1. ……………… 2. …………….. 3. ………………. 4. ……………….. 5. ……………….. 6. ……………….. 7. ……………… Beziehungen (Relationen) viele many - zu to - viele many Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 2 Warum Objektorientierung und Relationale DB RDBMS: ER-Modell für Yellow-Pages (2) n m Personen haben personen person_kompetenz P_ID NAME 1 Müller 2 14 P_ID Kompetenzen K_ID kompetenzen K_ID KOMP 1 1 3 3 2 3 arabisch Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 7 2 Warum Objektorientierung und Relationale DB einfache SQL-Abfrage an das RDBMS 15 Erläuterung Inhaltliche Frage: wer ist alles in der Datenbank? Technische Frage: welche Zeilen sind in der Tabelle „person“ ? SELECT * FROM person WHERE 1=1; Abfrage liefert komplette Tabelle Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 2 Warum Objektorientierung und Relationale DB komplexe SQL-Abfrage an das RDBMS 16 Inhaltliche Frage: welche Kompetenzen hat Müller? Technische Frage: welche Zeilen in der Tabelle „person_kompetenz“ haben die p_id von Müller? Dazu die passenden Kompetenzen aus der Tabelle kompetenzen… SELECT NAME, KOMPETENZ FROM kompetenzen, person_kompetenz, person, WHERE kompetenzen.k_id = person_kompetenz.k_id AND person_kompetenz.p_id = person.p_id AND personen.name = 'Mueller' Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 8 2 Warum Objektorientierung und Relationale DB Wie SQL-Abfragen nutzen? 17 Erläuterung 1. Direkt SQL-Abfragen an das RDBMS formulieren mysql> SELECT * from person 2. SQL-Abfragen in Anwendung verstecken mit PHP: $sql=„SELECT * FROM person“; $ergebnis=mysql_query($sql,$verbindung); while ($zeile=mysql_fetch_row($ergebnis)) foreach ($zeile as $feld) echo $feld; (das ist nur ein kleiner Teil des PHP-Scripts) Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 2 Warum Objektorientierung und Relationale DB Vollständiges Java-Beispiel Abfrage (1) 18 import java.sql.*; public class DbAbfrage { public static void main(String[] args) { // Query String entspricht der manuellen Abfrage String sDbDrv="com.mysql.jdbc.Driver", sDbUrl="jdbc:mysql://localhost:3306/yellowpages", sUsr="root", sPwd="", sQry="SELECT NAME, KOMPETENZ FROM kompetenzen, person_kompetenz, personen WHERE kompetenzen.k_id = person_kompetenz.k_id AND person_kompetenz.p_id = personen.p_id AND personen.name = 'Mueller'"; Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 9 2 Warum Objektorientierung und Relationale DB Vollständiges Java-Beispiel Abfrage (2) 19 Erläuterung // Database Driver, Treiber laden try {Class.forName(sDbDrv).newInstance();} // end try catch (Exception ex) { } // end catch // Connect to Database, Verbindung zu MySQL Connection conn = null; try {conn = DriverManager.getConnection(sDbUrl,sUsr, sPwd);} // end try catch (SQLException ex) { System.out.println("SQLException: " + ex.getMessage()); System.out.println("SQLState: " + ex.getSQLState()); System.out.println("VendorError: " + ex.getErrorCode()); } // end catch Statement stmt = null; ResultSet rs = null; try {stmt = conn.createStatement(); rs = stmt.executeQuery(sQry);.... Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 2 Warum Objektorientierung und Relationale DB Vollständiges Java-Beispiel Abfrage (3) 20 Erläuterung // Print Results, Ergebnis auswerten while ( rs.next() ) {System.out.printf( "%s : %s %n", rs.getString(1), rs.getString(2)); // rs.getString(1)= person.name, rs.getString(2)=kompetenz.tag } rs.close(); stmt.close(); } // end try catch (SQLException ex) {System.out.println("SQLException: " + ex.getMessage()); System.out.println("SQLState: " + ex.getSQLState()); System.out.println("VendorError: " + ex.getErrorCode()); } // end catch finally { } } // end main } // end class Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 10 2 Warum Objektorientierung und Relationale DB Vollständiges Java-Beispiel Abfrage (4) 21 Eclipse Screenshot Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 2 Warum Objektorientierung und Relationale DB Zwischenfazit: Programmieren und RDBMS 22 1. RDBMS sind verbreitet, billig, robust 2. SQL als Abfragesprache ist bekannt und robust 3. Schnittstellen gibt es zu fast allen Programmiersprachen 5. Zugriff auf RDBMS: über JDBC, ODBC 6. Programmierung i.W. prozeduraler Ansatz Frage: wie geht eine objektorientierte Denkweise mit RDBMS um? Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 11 2 Warum Objektorientierung und Relationale DB Welt der Objekte 23 person1: Herr Müller, kann arabisch und chinesisch. person2: Herr Corello, kann x und y. person kann Antwort auf die Frage geben: „Was kannst Du?“ (getKompetenzen()) person kann eine weitere Kompetenz bekommen oder eine Kompetenz verlieren. person3 kann in die YellowPages aufgenommen werden. (new Person) Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 2 Warum Objektorientierung und Relationale DB Person und Kompetenz als Klassen (1) 24 Formulierung in UML (vereinfacht): Person id name int string Kompetenz id kompetenz int string hier: nur zwei sehr einfache Klassen Person und Kompetenz mit einem Inhaltsattribut und einem Schlüssel. Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 12 2 Warum Objektorientierung und Relationale DB Person und Kompetenz als Klassen (2) 25 Formulierung in Java, Beispiel Person: public class Person { private int id; private String name; // künstlicher Schlüssel // Name der Person public Person(){} // leerer Standardkonstruktor public Person(String name){this.name=name;} //Überladen // Getter und Setter public int getId() { return id;} private void setId(int id) {this.id=id;} //keine eigene Verwaltung public String getName() { return name;} public void setName(String name) {this.name=name;} } Fehlt: Verbindung zur Klasse Kompetenz ! Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 2 Warum Objektorientierung und Relationale DB Person und Kompetenz als Klassen (3) 26 Verbindung zwischen den Klassen Person und Kompetenz: import java.util.Set; import java.util.HashSet; public class Person { ... private Set kompetenzen=new HashSet(); … } Analog in der Klasse Kompetenz ! Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 13 2 Warum Objektorientierung und Relationale DB Persistenz (1) 27 ! Fragen: Wie bleiben neue Objekte person1=new Person(„Meier“); person2=… der Nachwelt erhalten? Wie wird ein konkurrierender Zugriff auf die Objekte möglich? teilweise gute Antwort: durch Serialisierung oder Speicherung der Daten in Dateien. bessere Antwort: durch Speicherung in einem RDBMS (besser weil: Trennung von Datenhaltung und Anwendung, stabile RDBMS-Lösungen verfügbar, Multi-User-Betrieb möglich…) aber: hoher (Programmier- und Pflege-) Aufwand Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 2 Warum Objektorientierung und Relationale DB Persistenz (2) 28 ! Folgefrage: Gibt es keine Toolbox / Framework … zur Unterstützung der objektorientierten Programmierung bei gleichzeitiger Nutzung relationaler Datenbanken? Grundsätzlicher Lösungsansatz: Bibliothek, die die Abbildung (Mapping) der Objekte (in der Programmiersprache) auf Tabellen (im RDBMS) unterstützt. Lösungen: in der PHP-Welt: z.B. Doctrine in der Java-Welt: z.B. -iBatis und iBator-Tools -simpleORM -Hibernate -EJB Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 14 2 Warum Objektorientierung und Relationale DB Persistenz (2a) 29 Erläuterung warum Hibernate? Hibernate bietet mehr Funktionalität als iBatis. Hibernate benötigt schlankeren Code als simpleORM und ist performanter(*). Hibernate ist seit langem eingeführt. Für Hibernate gibt es (viel) Unterstützung im Internet. Hibernate lässt sich gut mit anderen Umgebungen kombinieren (Eclipse, Maven, Ant…) Hibernate unterstützt attraktive Konfigurationsmethoden (XML-Dateien, Annotations). Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 3 Warum Hibernate (… und was ist das) Hibernate als Persistenz-Lösung (1) 30 ! Was ist Hibernate: (*) Hibernate (englisch für „Winterschlaf halten“) ist ein Open-SourcePersistenz- und ORM-Framework für Java. Für .NET ist eine portierte Version namens NHibernate verfügbar. Hibernates Hauptaufgabe ist das Object-Relational Mapping (OR-Mapping, kurz ORM). Dies ermöglicht es, gewöhnliche Objekte mit Attributen und Methoden (im Java-Bereich POJOs genannt) in relationalen Datenbanken zu speichern und aus entsprechenden Datensätzen wiederum Objekte zu erzeugen. Beziehungen zwischen Objekten werden auf entsprechende Datenbank-Relationen abgebildet. (*) abgeschrieben aus Wikipedia: http://de.wikipedia.org/wiki/Hibernate_(Framework) Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 15 3 Warum Hibernate (… und was ist das) Hibernate als Persistenz-Lösung (2) 31 Eigenschaften von Hibernate: Hibernate ist flexibel, ein POJO kann aus einer Auswahl von Tabellenspalten konstruiert werde, mehrere POJOs können in einer Tabelle sein. Hibernate benötigt keinen Applikationsserver und ist für ClientAnwendungen geeignet. (Apps für Android?) Hibernate beeinflusst nicht Design-Entscheidungen hinsichtlich der Geschäftslogik. Hibernate benötigt Informationen, welche Objekte zu welchen Tabellen gehören (XML oder Java 5 Annotations). aber: Hibernate hat eine steile Lernkurve und richtet sich an den erfahrenen Java-Programmierer. Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 3 Warum Hibernate (.. und was ist das) Zusammenspiel Anwendung – Hibernate - RDBMS 32 ! Java-Anwendung Mapping klasse.hbm.xml Hibernate Konfiguration hibernate.cfg.xml JDBC RDBMS:MS-SQL-Server, DB2, Oracle, MySQL, SQLite RDBMS-Tabellen Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 16 33 4 Beispielimplementierung verschiedene Mapping-Mechanismen Erläuterung Mapping mit XML-Dateien …hbm.xml Wenig Eingriff in bestehende Anwendung. XML-Dateien können von Drittanwendungen generiert werden. … trägt zur Abflachung der Lernkurve bei. Mapping mit Annotations Wird als zukünftiger Standardweg diskutiert. Erfordert Java ab 1.5. Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 34 XML-Exkurs Was ist XML? Erläuterung XML: • Ableitung der genormten IBM-Beschreibungssprache GML. • Kennzeichnung der Elemente durch tags in „<>“. • Verbreitet und beliebt. • Viele Derivate! • Einfache Textdatei. • Gut lesbar: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <verzeichnis> <titel>Wikipedia Städteverzeichnis</titel> <eintrag> <stichwort>Genf</stichwort> <eintragstext>Genf ist der Sitz von ...</eintragstext> </eintrag> </verzeichnis> Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 17 35 XML-Exkurs Nützliche XML-Derivate Erläuterung GPX: Beschreibung von geografischen Koordinaten, Kommunikation Computer mit Navi… SVG: Standard für Beschreibung von Vekorgrafiken… weiter spezielle Formate unter http://de.wikipedia.org/wiki/XML Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 36 4 Beispielimplementierung Mapping Klassen<->DB via XML vereinfachtes Beispiel: ! Klasse in Java-Anwendung: public class Person { private int id; private string name; } Zuordnung via XML-Datei: … <class name=„Person“ table=„personen“> <id type=„int“ column=„P_ID“> <generator class=„native“/> </id <property name=„name“ column=„NAME“ type=„string /> </class> … Tabelle in Datenbank: personen P_ID NAME 1 Müller 2 Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 18 4 Beispielimplementierung erforderliche Schritte für neue Anwendung 37 zwei Möglichkeiten, neue Anwendung zu erstellen: 1. Klassen schreiben 2. Datenbank erstellen 3. XML-Mapping erstellen oder 1. XML-Mapping erstellen 2. Datenbank automatisiert erzeugen lassen (Ant-Script) 3. Klassen erzeugen lassen und umschreiben oder… Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 4 Beispielimplementierung Möglichkeiten, Quelltext zu erzeugen 38 Hibernate Tools für Reengeneering: Java Klassen xDoclet class2hbm hbm2java XML Mapping hbm2ddl RDBMSTabellen Middlegen Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 19 39 4 Beispielimplementierung Reverse Engeneering (1) ! Oft wurde das Datenmodell als erstes erstellt. Daten sind langlebiger als Funktionen Bei Relaunch der Anwendung möchte man die Datenbank beibehalten. => Hibernate in der Version 3 setzt verstärkt auf reverse engeneering. => Hibernate tools unterstützen die Generierung von Mapping und Klassen aus der Datenbank. Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 40 4 Beispielimplementierung Reverse Engeneering (2) Erläuterung Beispiel: Reverse Engeneering mit vereinfachten Tabellen: person hat kompetenz p_id name p_id k_id p_id tag 1 Mueller 1 1 1 C++ 2 Schmidt 1 2 2 Fortran 2 2 3 Java 2 3 Erwartet: Zwei Klassen Person und Kompetenz, zwei …hbm.xml-Dateien, jeweils mit Mapping Anweisungen entsprechend Tabelle „hat“. Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 20 41 4 Beispielimplementierung Reverse Engeneering (3) Ergebnis: Erläuterung Entspricht nicht der Erwartung, aber schon gute, Tipparbeit sparende Grundlage! Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 4 Beispielimplementierung Vereinfachte Vorgehensweise in zwei Stufen 42 Weiteres Vorgehen heute: Stufe 1 (triviales Beispiel: PersonenRegister): Aufbau und Test einer einfachen Anwendung („manuell“) Mit nur einer Klasse Person und einer Tabelle PERSONEN Ziel: Test und Einrichtung der Hibernate-Umgebung Stufe 2 (einfaches erweiterbares Beispiel: YellowPages): Aufbau und Test Demo-Anwendung („manuell“) Mit zwei Klassen Person und Kompetenz und einer Viele-zu-viele-Relation Ziel: Grundlage schaffen für eigene Erweiterungen Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 21 4 Beispielimplementierung Stufe 1 (triviales Beispiel) (1) 43 Java Klasse Person: Person.java package PersonenRegister; public class Person { private int id; private String name; // künstlicher Schlüssel // Name der Person public Person(){} // leerer Standardkonstruktor, Pflicht! public Person(String name){this.name=name;} //Überladen // Getter und Setter public int getId() { return id;} private void setId(int id) {this.id=id;} //keine eigene Verwaltung public String getName() { return name;} public void setName(String name) {this.name=name;} } Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 4 Beispielimplementierung Stufe 1 (triviales Beispiel) (2) 44 Datenbank-Tabelle personen Screenshot Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 22 45 4 Beispielimplementierung Stufe 1 (triviales Beispiel) (3) XML-Mapping-Datei: Person.hbm.xml Java Klasse …. <class name="PersonenRegister.Person" table="personen" > <id name="id" type="int"> <column name="PERSON_ID" /> <generator class="native" /> </id> <property name="name" type="java.lang.String" > <column name="NAME" /> </property> </class> </hibernate-mapping> DB Tabelle Java Attribut DB Spalte Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 46 4 Beispielimplementierung Stufe 1 (triviales Beispiel) (3) Hibernate-Konfigurations-Datei: hibernate.cfg.xml Erläuterung <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE hibernate-configuration (View Source for full doctype...)> <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class"> org.gjt.mm.mysql.Driver</property> <property name="hibernate.connection.url"> jdbc:mysql://localhost/personenregister</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.dialect"> org.hibernate.dialect.MySQL5Dialect</property> <mapping class="PersonenRegister.Person" /> <mapping resource="PersonenRegister/Person.hbm.xml" /> </session-factory> </hibernate-configuration> Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 23 47 4 Beispielimplementierung Stufe 1 (triviales Beispiel) (5) Anwendung zum Anlegen einer Person: addPerson.java Ausschnitt: public static void main(String[] args) { Hibernate Session session=factory.openSession(); System.out.printf( "Neue Person eingeben..."); Scanner eingabe=new Scanner(System.in); String neuerName=eingabe.next(); // die eigentliche "Persistenz-Aktion" : session.beginTransaction(); Person anlegen Person person=new Person(neuerName); System.out.printf ( "Neue Person : %s %d %n", person.getName(), person.getId()); session.save(person); session.getTransaction().commit(); session.close(); } Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 48 4 Beispielimplementierung Stufe 1 (triviales Beispiel) (6) Anwendung zum Anlegen einer Person: addPerson.java komplett: Erläuterung package PersonenRegister; // hibernate3.jar zum build-path hinzufügen !! import org.hibernate.Session; // für Hibernate import org.hibernate.SessionFactory; // für Hibernate import org.hibernate.cfg.Configuration; // für Hibernate import java.util.Scanner; // für Tastatureingabe import java.io.*; public class AddPerson { // aus Hibernate-Doku-Tutorial private static final SessionFactory factory=buildSessionFactory(); private static SessionFactory buildSessionFactory() { try{return new Configuration().configure().buildSessionFactory();} catch (Throwable ex){ System.err.println("kann SessionFactory nicht bauen: "+ex); throw new ExceptionInInitializerError(ex); } // benötigt dom4j, slf4j } public static void main(String[] args) { Session session=factory.openSession(); System.out.printf( "Neue Person eingeben..."); Scanner eingabe=new Scanner(System.in); String neuerName=eingabe.next(); session.beginTransaction(); // die eigentliche "Persistenz-Aktion" Person person=new Person(neuerName); System.out.printf( "Neue Person : %s %d %n", person.getName(), person.getId()); session.save(person); session.getTransaction().commit(); session.close();}} Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 24 4 Beispielimplementierung Stufe 1 (triviales Beispiel) (7) 49 Screenshot Ergebnis: addPersonen Eclipse phpMyAdmin Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 4 Beispielimplementierung Stufe 1 (triviales Beispiel) (8) 50 Anwendung zum Anzeigen aller Personen: listPersonen.java Ausschnitt: public static void main(String[] args) { HQL Session session=factory.openSession(); statt SQL session.beginTransaction(); // Achtung: in Klasse, nicht in Tabelle suchen List personen=session.createQuery("from Person").list(); System.out.println(personen.size()+" Personen gefunden:"); System.out.println("id\t\tName"); Iterator i=personen.iterator(); while (i.hasNext()){ Person person = (Person) i.next(); System.out.printf("%d\t\t%s\n",person.getId(),person.getName()); } session.getTransaction().commit(); session.close(); } Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 25 4 Beispielimplementierung Stufe 1 (triviales Beispiel) (9) 51 Erläuterung Anwendung zum Anzeigen aller Personen: listPersonen.java komplett: package PersonenRegister; // hibernate3.jar zum build-path hinzufügen !! import org.hibernate.Session; // für Hibernate import org.hibernate.SessionFactory; // für Hibernate import org.hibernate.cfg.Configuration; // für Hibernate import java.util.List; // für Listenelemente import java.util.Iterator; public class ListPersonen { // aus Hibernate-Doku-Tutorial private static final SessionFactory factory=buildSessionFactory(); private static SessionFactory buildSessionFactory() { try{return new Configuration().configure().buildSessionFactory(); } catch (Throwable ex){ System.err.println("kann SessionFactory nicht bauen: "+ex); throw new ExceptionInInitializerError(ex); } // benötigt dom4j, slf4j } public static void main(String[] args) { Session session=factory.openSession(); session.beginTransaction(); // die eigentliche "Persistenz-Aktion", Beispiel aus "Einführung in Hibernate" : // Achtung: in Klasse, nicht in Tabelle suchen List personen=session.createQuery("from Person").list(); System.out.println(personen.size()+" Personen gefunden:"); System.out.println("id\t\tName"); Iterator i=personen.iterator(); while (i.hasNext()){ Person person = (Person) i.next(); System.out.printf("%d\t\t%s\n",person.getId(),person.getName()); } session.getTransaction().commit(); session.close();}} Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 4 Beispielimplementierung Stufe 1 Stufe 1 (triviales Beispiel) (10) 52 Screenshot Ergebnis ListPersonen Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 26 4 Beispielimplementierung Zwischenfazit 53 ! Bisher erreicht: Automatisierte Abbildung einer Klasse Person auf eine RDBMS-Tabelle personen. Nutzung des ORM-Werkzeuges Hibernate in einer einfachen PersonenRegister-Anwendung Damit möglich: Trennung der Anwendung und der Klassen von der Datenhaltung, keine „eigene“ Datenbankprogrammierung erforderlich, keine Abhängigkeit der Programmierung vom RDBMS. => z.B. Portierung auf Android-Handy mit SQLite o. H2 denkbar Noch Offen: Persistierung komplexerer, mehrere Objekte in einer Anwendung YellowPages. => Stufe 2 Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 4 Beispielimplementierung Stufe 2 (erweiterbares Beispiel: YellowPages) (1): 54 Erweiterung der Java Klasse Person: Person.java package YellowPages; import java.util.Set; import java.util.HashSet; public class Person { private int id; // künstlicher Schlüssel private String name; // Name der Person private Set kompetenzen=new HashSet(); public Person(){} // leerer Standardkonstruktor public Person(String name){this.name=name;} //Überladen // Getter und Setter public int getId() { return id;} private void setId(int id) {this.id=id;} //keine eigene Verwaltung public String getName() { return name;} public void setName(String name) {this.name=name;} public Set getKompetenzen(){return kompetenzen;} public void setKompetenzen(Set kompetenzen){ this.kompetenzen=kompetenzen;} } Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 27 55 4 Beispielimplementierung Stufe 2 (erweiterbares Beispiel: YellowPages) (2): Neue Java Klasse Kompetenz: Kompetenz.java Erläuterung package YellowPages; import java.util.Set; import java.util.HashSet; public class Kompetenz { private int id; // künstlicher Schlüssel private String kompetenz; // Name der Person private Set personen=new HashSet(); public Kompetenz(){} // leerer Standardkonstruktor public Kompetenz(String kompetenz){this.kompetenz=kompetenz;} //Überladen // Getter und Setter public int getId() { return id;} private void setId(int id) {this.id=id;} //keine eigene Verwaltung public String getKompetenz() { return kompetenz;} public void setKompetenz(String kompetenz) {this.kompetenz=kompetenz;} public Set getPersonen(){return personen;} public void setPersonen(Set personen){this.personen=personen;} } Beachte: keine Klasse für die Relation erforderlich!!! Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 56 4 Beispielimplementierung Stufe 2 (erweiterbares Beispiel: YellowPages) (3): erweiterte XML-Mapping-Datei: Person.hbm.xml Erläuterung …. <hibernate-mapping> <class name="YellowPages.Person" table="personen" catalog="YellowPages"> <id name="id" type="int"> <column name="PERSON_ID" /> <generator class="native" /> </id> <property name="name" type="java.lang.String"> <column name="NAME" /> </property> <set name="kompetenzen" table="person_kompetenz"> <key column="PERSON_ID"/> <many-to-many class="YellowPages.Kompetenz" column="KOMPETENZ_ID"/> </set> </class> </hibernate-mapping> Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 28 57 4 Beispielimplementierung Stufe 2 (erweiterbares Beispiel: YellowPages) (4): neue XML-Mapping-Datei: Kompetenz.hbm.xml Erläuterung …. <hibernate-mapping> <class name="YellowPages.Kompetenz" table="kompetenzen" catalog="YellowPages"> <id name="id" type="int"> <column name="KOMPETENZ_ID" /> <generator class="native" /> </id> <property name="kompetenz" type="java.lang.String"> <column name="KOMPETENZ" /> </property> <set name="personen" table="person_kompetenz"> <key column="KOMPETENZ_ID"/> <many-to-many class="YellowPages.Person" column="PERSON_ID"/> </set> </class> </hibernate-mapping> Beachte: keine XML-Datei für die Relation erforderlich!!! Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 4 Beispielimplementierung Stufe 2 (erweiterbares Beispiel: YellowPages) (5): 58 Erläuterung Datenbank-Tabellen personen, kompetenzen und person_kompetenz CREATE TABLE IF NOT EXISTS kompetenzen ( KOMPETENZ_ID int(11) NOT NULL AUTO_INCREMENT, KOMPETENZ varchar(100) COLLATE latin1_german1_ci NOT NULL, UNIQUE KEY KOMPETENZ_ID (KOMPETENZ_ID) ) ENGINE=MyISAM; CREATE TABLE IF NOT EXISTS personen ( PERSON_ID int(11) NOT NULL AUTO_INCREMENT, NAME varchar(40) COLLATE latin1_german1_ci NOT NULL, UNIQUE KEY PERSON_ID (PERSON_ID) ) ENGINE=MyISAM; CREATE TABLE IF NOT EXISTS person_kompetenz ( PERSON_ID int(11) NOT NULL, KOMPETENZ_ID int(11) NOT NULL ) ENGINE=MyISAM; Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 29 59 4 Beispielimplementierung Stufe 2 (erweiterbares Beispiel: YellowPages) (6): Erläuterung Auflisten von Personen und Kompetenzen: Anwendung nun komplexer. Ausschnitt: List personen=session.createQuery("from Person").list(); System.out.println(personen.size()+" Personen gefunden:"); System.out.println("id\tName\t\tKompetenzen"); Iterator i=personen.iterator(); while (i.hasNext()){ Person person = (Person) i.next(); System.out.printf("%d\t%s\t\t",person.getId(),person.getName()); Iterator k=person.getKompetenzen().iterator(); while (k.hasNext()){ System.out.printf("%s, ",((Kompetenz) k.next()).getKompetenz()); } System.out.printf("\n"); Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 60 4 Beispielimplementierung Stufe 2 (erweiterbares Beispiel: YellowPages) (7): Erläuterung Screenshot der Auflistung: YellowPages.listPersonen.java Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 30 61 5 Fazit und kritische Anmerkungen Heute erreicht… Erläuterung Einfache Yellow-Pages-Anwendung mit zwei Klassen Person und Kompetenz Anbindung an zwei Tabellen personen und kompetenzen sowie der Relation person_kompetenz über das ORM-Werkzeug Hibernate Grundsätzliche Struktur einer objektrelationalen Abbildung (ORM, object relational mapping) mit einer viele-zu-viele Relation. Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 5 Fazit und kritische Anmerkungen Hinweise zum Einsatzgebiet von Hibernate 62 ! Hibernate (wie jedes komplexe Framework) kostet Performance. => weniger geeignet für Batchläufe mit 1 Mio Datensätzen Hibernate (wie jedes komplexe Framework) erfordert Einarbeitungsaufwand. => weniger geeignet für einmalige, einfache DB-Programmieraufgaben Hibernate Tools erleichtern die Anbindung an bestehende Datenbank. => geeignet für Reengeneering-Projekte Hibernate ermöglicht kompakten Code. => geeignet für wiederkehrende Aufgaben auf komplexe Datenbanken Hibernate abstrahiert von JDBC und RDBMS. => geeignet für Anwendungen, die auf unterschiedlichen Plattformen laufen sollen. (mit SQLite oder H2 auf Android, mit DB2 auf IBM 3090) Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 31 63 6 Tipps zum „Weiterspielen“ mit Hibernate Erläuterung Einrichten einer Datenbankumgebung mit MySQL: XAMPP-Paket http://www.apachefriends.org/de/xampp.html Alternative: H2 http://www.h2database.com/html/main.html Java SDK einrichten: http://www.oracle.com/technetwork/java/javase/downloads/index.html optional Eclipse einrichten: http://www.eclipse.org/downloads/ optional Maven einrichten: http://maven.apache.org/download.html Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 64 6 Tipps zum „Weiterspielen“ mit Hibernate ! Hibernate einrichten: (lt. Hibernate-Tutorial mit Maven oder mit Eclipse) Nur mit einer Tabelle und Klasse Person starten, Datenbankverbindung testen, Hibernate-Tools testen. Beispiel Yellow Pages weiterentwickeln. (als einfache many-to-many Relation, Person mit Kompetenzen anlegen) Auf eigenes Projekt (Bilddatenbank, Zitatesammlung…) erweitern. VIEL SPASS!! Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 32 65 Anhang Hilfreiche Anleitungen Erläuterung Hibernate Kurztutorial: http://www.wenzlaff.de/hibernate.html http://www.bennyn.de/programmierung/java/hibernate-tutorial-in-kurzform.htm SQL und Java: http://www.torsten-horn.de/techdocs/java-sql.htm Hibernate Tools, Reverse Engeneering: http://it-republik.de/jaxenter/artikel/Hibernate-Tools-0850.html Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 66 Anhang Hilfreiche Literatur Erläuterung Für Java Anfänger: Niemann, Alexander: Objektorientierte Programmierung in Java. Bhv,5. Auflage 2007 Ullenboom, Christian: Java ist auch eine Insel. Galileo, 9. Auflage 2010 Für RDBMS-Anfänger: Bornträger, Axel: MySQL5 für Professionals. Franzis. 2006 Hibernate-Einstieg: Minter, Dave; Linwood, Jeff: Einführung in Hibernate. Mitp. 2007 Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 33 67 Anhang Glossar Erläuterung POJO SQL RDBMS MySQL HSQL Plain Old Java Object Query Language Relationales Datenbank Management System weit verbreitetes, freies RDBMS Java-RDBMS, Nachfolgeprojekt ist H2 Objektrelationale Abbildung am Beispiel von Hibernate, Dr. rer. nat. Claus Brell 34