5. Objekt-Relationales Mapping
Unterschiede Objektorientiert – Relational
OO Konzepte
Vererbung
Polymorphie
Kapselung
Objektbeziehungen
Identität über Adressen
Programm. Integrität
keine Transaktionalität
RDB Konzepte
keine Vererbung
keine Polymorphie
keine Kapselung
Relationen
Identität über Schlüssel
Referentielle Integrität
Transaktionalität
► www.e-movimento.com, Sebastian Dietrich5
Aber nicht nur die Konzepte unterscheiden sich…
6. Unterschiede Objektorietiert – Relational
Object-Relational Impedance Mismatch
Ein gutes Objektmodell…
Ist optimiert für (sich laufend ändernde) fachliche Anforderungen
Definiert Fachdaten (Businessobjekte) und deren Logik
Verwendet Fachtermini („ubiqutous language“)
Wird (meist) für jede Applikation neu & völlig anders definiert
Wird laufend refaktorisiert
…
Ein gutes Datenbankschema…
Vermeidet Redundanzen mittels Normalformen
Optimiert Leistung
Stellt Konsistenz und Integrität der Daten sicher
Ist (meist) applikationsübergreifend
…
Object-
Relational
Impedance
Mismatch
► www.e-movimento.com, Sebastian Dietrich6
7. Object-Relational Impedance Mismatch
Unterschiede
Struktur: Objekt = Daten + Verhalten, Vererbung
Instanz: Objektzustand = Daten + Referenzen
an einem Objekt hängt potentiell die gesamte DB
Kapselung: Attribute können von außen nur über wohldefinierte
Zugriffsmethoden verändert werden
Identität: Objektidentität von seinen Daten unabhängig Daten
reichen nicht um Identität in OO zu bestimmen
Arbeitsweise: OO = Netzwerk interagierender Objekte, Zugriff auf
Objekte über Referenzen, keine Transaktionen, keine
mengenbasierte Arbeitsweise
Verantwortlichkeit: Objektmodell in Verantwortlichkeit der
Entwickler einer Applikation, unterliegt ständiger ungeplanter
Änderung
Sprachwechsel: SQL vs. Java, Unterschiedliche Typsysteme,
unterschiedliche Behandlung komplexer Typen, Wertobjekte
► www.e-movimento.com, Sebastian Dietrich7
8. Object-Relational Impedance Mismatch
Lösung
Unterschiedliche Lösungsansätze:
Objektorientierte Datenbanken
Objektbasierte Datenbanken
Relationale Funktionen in Sprachen (Embedded SQL)
XML-DBs, Triplestores, …
NoSQL (Google BigTable, Amazon Dynamo, CouchDB, ...)
Objektrationale Mapper (O/R Mapper)
Ideale Lösung?
Keine ideale Lösung möglich – nur Umgehungen des
Problems. Wartbarkeit vs. Performance
30 - 40% der Entwicklungszeit geht in OR-IM
[C. Keene 2004]
► www.e-movimento.com, Sebastian Dietrich8
9. Object-Relational Impedance Mismatch
Abbildung von Vererbung OO RDB
Abbildung von Vererbung = Ein Teilaspekt des ORIM
Nicht Trivial Lösung: Objekt-Relational-Mapper (= OR-
Mapper)
Mitarbeiter
Interner Externer
<<abstract>>
Person
Person
Mitarbeiter
Interner
Externer
?
► www.e-movimento.com, Sebastian Dietrich9
10. Abbildung von Vererbung OO RDB
Lösungswege
„Single Table“, „Table per class-
hierarchy“, „Filter-Mapping“
1 Tabelle für alle Attribute der
Basisklasse und davon abgeleiteten
Klassen, dazu "Diskriminator" = Typ
des Objektes
„Joined“, „Table per subclass“,
„Vertikales Mapping“
1 Tabelle für Basisklasse angelegt
und für jede davon abgeleitete
Unterklasse, 1:1 Beziehungen
dazwischen
„Table per concrete class“,
„Horizontales Mapping“
1 Tabelle für konkrete Unterklassen
inkl. Attribute abstrakter Basisklassen
Person
Attribute von
Person, Mitarbeiter,
Externer und Interner
+ Typkennzeichen
Person Mitarbeiter
Interner Externer
Mitarbeiter
inkl. Attr.
von Person
Interner
inkl. Attr. von
Person &
Mitarbeiter
Externer
inkl. Attr. von
Person &
Mitarbeiter
► www.e-movimento.com, Sebastian Dietrich10
11. Abbildung von Vererbung OO RDB
Weitere Lösungswege
„General" = Generelle Tabellen
Eine Tabelle für Klassen
Eine für Beziehungen (inkl.
Vererbung)
Eine für Attribute
Eine für Instanzen
Eine für Werte
► www.e-movimento.com, Sebastian Dietrich11
12. Abbildung von Vererbung OO RDB
Vor- und Nachteile
"Single Table"
DB Struktur typisch für RDBs
einfacher für DBAs
- Verbraucht mehr Speicherplatz
- Probleme mit "NOT NULL"
"Joined"
DB Struktur passt zur OO
Struktur einfachere
Integration
- Performance (joined Queries
für Listen unterschiedlicher
Typen)
"Table per Class"
- Performance (mehrere Queries
für Listen unterschiedlicher
Typen)
Person
Attribute von
Person, Mitarbeiter,
Externer und Interner
+ Typkennzeichen
Person Mitarbeiter
Interner Externer
Mitarbeiter
inkl. Attr.
von Person
Interner
inkl. Attr. von
Person &
Mitarbeiter
Externer
inkl. Attr. von
Person &
Mitarbeiter
► www.e-movimento.com, Sebastian Dietrich12
13. Objekt-Relational Impedance Mismatch
Faulheitsprinzip
Das Rad nicht neu erfinden:
Mein Programm ist nicht das
erste, das auf eine DB zugreift
30-40% des gesamten
Codierungsaufwandes gehen
in ORIM
Frameworks
Spring JDBC
iBATIS
JDO, JPA
Hibernate, EclipseLink, …
Ist eine Datenbank wirklich
nötig? Alternativen:
RAM (BigMemory)
Archive, Bibliotheken, …
Konfigurationsdateien
Files, XML, Serialisierte
Objekte, Preferences, …
OODBs, XML-DBs,
Semantische DBs
Was sind Vorteile von DBs?
Schneller?
Skalierbarer?
Größer?
► www.e-movimento.com, Sebastian Dietrich13
14. JDBC
myBATIS
DB
EasyBeans, TopLink,
OpenJPA, EclipseLink,
Cayenne, Hibernate,
DataNucleus
JBoss, WebSphere, OC4J,
Geronimo, Glassfish
Persistenzlayer und OR Mapper in Java
Architekturelle Positionierung
JDBC
Persistenz Layer
OR Mapper
DB
JDO / JPA Container
EJB App Server
Spring-JDBC
DbUtils, DBCP
► www.e-movimento.com, Sebastian Dietrich14
15. ► www.e-movimento.com, Sebastian Dietrich15
Persistenzlayer und OR Mapper in Java
Hibernate
Hibernate = OR Mapper von JBoss (RedHat)
Persistenzmechanismus von Jboss Application Server
Features:
Abfragen mittels SQL, HQL, Criteria API, Stored Procedures
POJOs ↔ Mapping / Annotations ↔ DB Tabellen
Transaktionen, Caches, Lazy Loading, Kaskadierungen, …
Weitere Features:
EntityManager – Verwendung von Hibernate via JPA
Shards – horizontal partitionierte DBs
Validator – Daten Integrität & Validierung
Tools – Eclipse & Roundtrip Engineering
Search – Volltextindices & -suche
16. ► www.e-movimento.com, Sebastian Dietrich16
AppHibernate
Persistenzlayer und OR Mapper in Java
Hibernate Architektur
Transient Objects
Aktuell nicht an Session hängende
persistente Objekte (POJOs)
Persistent Objects
An Session hängende Objekte mit
persistentem Status (POJOs)
SessionFactory
Factory für Sessions
Precompiled Query Cache
Session
Kommunikation zwischen
Anwendung und Datenbank
Kapselt JDBC-Verbindung
Cache von persistenten Objekten
Hat 1..N Transaktionen
Transaction
ACID Arbeitseinheit
JDBC, JTA, … Transaktionen
Java JNDI JDBC JTA
DB
TransactionSession
Session Factory
Connection
Provider
TransactionFactory
Persistent
Objects
Transient
Objects
17. ► www.e-movimento.com, Sebastian Dietrich17
Persistenzlayer und OR Mapper in Java
Hibernate Beispiel
Tabelle KUNDE:
Java Klasse (POJO):
public class Kunde {
private int id;
private String name;
private String ort;
private String strasse;
private int plz;
// no getter & setter
}
Hibernate Configdatei für DB-,
SQLDialekt-, Caching- … Config
Hibernate Mappingdatei:
…
<class name="Kunde"
table="KUNDE">
<id name="id" column="ID">
<generator class="native"/>
</id>
<property name="name" />
…
</class>
…
Java Code:
session.beginTransaction();
List kunden = session
.createQuery("from KUNDE")
.list();
session.getTransaction()
.commit();
return kunden;
Attribut Typ
ID INTEGER NOT NULL
PRIMARY KEY
NAME VARCHAR(128)
STRASSE VARCHAR(128)
ORT VARCHAR(128)
PLZ INTEGER
18. ► www.e-movimento.com, Sebastian Dietrich18
Hibernate Beispiel
Mapping von Vererbung mittels Annotations
Table per Subclass = „Joined“:
Hibernate Annotations:
@Entity @Table(name=„PERSON“)
@Inheritance(strategy=JOINED)
public class Person {
@ID @GeneratedValue
@Column(name=„PERSON_ID“)
private Long personId;
…
@Entity @Table(name=„MITARBEITER“)
@PrimaryKeyJoinColumn
(name=„PERSON_ID“)
public class Mitarbeiter
extends Person {
…
@Entity @Table(name=„INTERNER“)
@PrimaryKeyJoinColumn
(name=„PERSON_ID“)
public class Interner
extends Mitarbeiter {
…
Mitarbeiter
Interner Externer
<<abstract>>
Person
Person Mitarbeiter
Interner Externer
19. ► www.e-movimento.com, Sebastian Dietrich19
Vielen Dank für Ihre Aufmerksamkeit!
Q&A[Sebastian Dietrich]
Sebastian.Dietrich@e-movimento.com
http://managing-java.blogspot.com