Objektrelationale Abbildung am Beispiel von Hibernate

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