Kein Folientitel

Werbung
O/R - Mapper Hibernate
ETIS SS04
Gliederung
• Motivation
• Architektur
• Persistente Klassen
• Mapping-Files
• Konfiguration und Datenbanken
• Ablauf der Anwendung
• Anfrage
• Zusammenfassung
Hibernate
ETIS SS04
2
Motivation (I)
• Impendance Mismatch: Kluft zwischen RDBMS und
Objektorientierte Programmiersprachen
– RDBMS: Relationen, Tupel, Attribute,
Fremdschlüsselbeziehungen, …
– OO Programmiersprachen: Klassen, Objekten,
Eigenschaften, Beziehungen, …
• sollen Objekte persistent gemacht werden:
– Kluft zwischen beiden Paradigmen tritt hervor, d.h. ca.
35% des Anwendungscodes für Mapping
Anwendungsdaten auf Datenspeicher aufgewendet
Hibernate
ETIS SS04
3
Motivation (II)
• Überwinden Impedance Mismatch
– kleine Anwendungen: manuelles Mapping mittels JDBC
ausreichend
– große Anwendungen: ORM sparen Zeit und
Arbeitsaufwand
• Ziele ORM:
– Abbilden von Anwendungsdaten auf DB-Daten
– Plain Old Java Objects (POJOs) persistent machen
– Anfragen und Suchen von Daten
– Abhängigkeiten von herstellerspezifischem SQL-Code
beseitigen
– evtl. dafür Query Language anbieten
Hibernate
ETIS SS04
4
Motivation (III)
• Hibernate:
– populärstes O/R Mapping-Werkzeug für Java Umgebung
– open source + große aktive Community
• Ziel:
– Entwickler 95% der Programmieraufgaben für
Datenpersistenz abnehmen
– Zeit für manuelles Datenhandling SQL + JDBC reduzieren
– transparente Persistenz
• Voraussetzungen:
– JDK ab 1.2
– SQL DBMS (MySQL, Oracle, DB2, generischer Zugriff…)
Hibernate
ETIS SS04
5
Architektur (I)
Transiente Objekte
Anwendung
Persistente
Objekte
SessionFactory
TransactionFactory ConnectionProvider
JNDI
JDBC
Session
Transaktion
JTA
Datenbank
Hibernate
ETIS SS04
6
Architektur (II)
• SessionFactory
– Cache von kompilierten Abbildungen für einzelne DBs
– Factory für Sessions
• Session
– repräsentiert Konversation zwischen Anwendung und
persistentem Speicher
– kapselt JDBC-Verbindung
– hält Cache von persistenten Objekten, für Navigation auf
Objektgraph oder um Objekte anhand ID zu finden
Hibernate
ETIS SS04
7
Architektur (III)
• Persistente Objekte
– kurzlebige Objekte, die persistenten Status +
Geschäftsfunktionen enthalten (POJOs/JavaBeans)
– mit genau einer Session verbunden
• Transiente Objekte
– Instanzen von persistenten Klassen, die aktuell nicht mit
Session verbunden
• Transaction
– kurzlebiges Objekt, um atomare Arbeitseinheit festzulegen
– abstrahiert von JDBC, JTA, Corba-Transaktionen
– Session kann mehrere Transaktionen umfassen
Hibernate
ETIS SS04
8
Persistente Klassen (I)
public class Serie {
private Integer id;
private String serie;
private Set comic = new HashSet();
public Integer getId() { return id;}
//restliche getter-Methoden
public void setId(Integer integer) { id = integer;}
//restliche setter-Methoden
}
Hibernate
ETIS SS04
9
Persistente Klassen (II)
• Hibernate arbeitet am besten mit POJOs (ähnlich JavaBeans)
• Hibernate ist nicht eingeschränkt bei Datentypen für
Eigenschaften der POJOs, möglich sind also:
– alle JDK-Typen inkl. Collections
– primitive Datentypen
• Hibernate unterstützt transparente Persistenz
– keine speziellen Interfaces, Superklassen für
Persistentmachung nötig
– Reflection und Laufzeitklassen Enhancement (keine BytecodeManipulation)
– keine Abhängigkeit von Hibernate in der POJO-Klasse
Hibernate
ETIS SS04
10
Mapping-Files (I)
<?xml version='1.0'?><!DOCTYPE hibernate-mapping ...>
<hibernate-mapping>
<class name=“etis.Serie" table="T_Serie">
<id name="id" unsaved-value="null">
<column name="pk_serie"/><generator class="increment"/>
</id>
<property name="sname“/>
<set name="comic" table="T_Comic" lazy="true">
<key column="fk_serie"/><one-to-many class=“etis.Comic"/>
</set>
</class>
</hibernate-mapping>
Hibernate
ETIS SS04
11
Mapping-Files (II)
• Enthält Metadaten für das O/R-Mapping
– Deklaration persistenter Klassen
– Abbildung von Eigenschaften auf die von DB-Relationen
• persistente Klassen sollten Identifier besitzen
– zur Unterscheidung von Objekten
• Defaultsettings benutzt, wenn nur Property mit Namen
angegeben
• Beziehungen (Assoziationen) von Objekten mappen:
– one-to-one, one-to-many,
– many-to-one, many-to-many
Hibernate
ETIS SS04
12
Konfiguration und Datenbank (I)
<?xml version='1.0'><!DOCTYPE hibernate-configuration ...">
<hibernate-configuration>
<session-factory>
<property name="connection.url"> jdbc:mysql://short/hibernate </property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.username"> <!--user--> </property>
<property name="connection.password"> <!--login--> < /property>
<property name="dialect"> net.sf.hibernate.dialect.MySQLDialect </property>
<property name="hibernate.hbm2ddl.auto"> create </property>
<mapping resource=“etis\Comic.hbm.xml"/>
<mapping resource=“etis\Serie.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Hibernate
ETIS SS04
13
Konfiguration und Datenbank (II)
• Properties mit Präfix connection
– notwendige Konfiguration zum Aufbau einer JDBCVerbindung
• property dialect
– legt den SQL-Dialekt fest
• property hibernate.hbm2ddl.auto mit Wert create
– automatisches Anlegen des Schemas in die DB, wenn
SessionFactory kreiert wird
• mapping resource
– Pfade zu den Mapping Files der Klassen
Hibernate
ETIS SS04
14
Ablauf der Anwendung (I)
private SessionFactory sessionFactory;
public Run() {
try {
sessionFactory = new Configuration()
.configure(“/hibernate.cfg.xml“)
.buildSessionFactory();
} catch (HibernateException e) {
e.printStackTrace();
}
public static void main(String[] args) {
Run run = new Run();
Hibernate
ETIS SS04
15
Ablauf der Anwendung (II)
Session s = factory.openSession();
Transaction tx = null;
try {
tx = s.beginTransaction();
Serie serie = new Serie();
serie.setSName(“Asterix");
s.save(serie);
tx.commit();
s.close();
} catch (HibernateException e) {
e.printStackTrace();
}}
Hibernate
ETIS SS04
16
Ablauf der Anwendung (III)
• SessionFactory
– verantwortlich für eine DB (kann nur ein XML
Konfigurationsfile nutzen (hibernate.cfg.xml))
– Eigenschaften der Session Factory vor ihrer Erstellung
treffen (Session Factory ist unveränderlich)
• Session
– repräsentieren Arbeitseinheit mit DB
– geöffnet von SessionFactory
– jede DB-Operation in Session tritt innerhalb einer Transaktion
auf (isoliert DB-Operationen)
• Objekte wie in Java üblich erzeugt (persistent mit save)
Hibernate
ETIS SS04
17
Anfragen (I)
Session s = factory.openSession();
Transaction tx = null;
try {
tx = s.beginTransaction();
Query q1 = s.createQuery("from Serie");
List l = q1.list()
//Ausgabe ...
tx.commit();
s.close();
} catch (HibernateException e) {
e.printStackTrace();
}
Hibernate
ETIS SS04
18
Anfragen (II)
• Hibernate hat verschiedene Anfrage-Methods
– Hibernate Query Language (HQL),
– Criteria
– direkte SQL-Anfragen
• am flexiblesten: HQL
– leicht zu erlernen
– vielseitige oo Erweiterung für SQL
• Hibernate nutzt für gesamte SQL-Kommunikation mit
DB PreparedStatements und Parameterbindung
Hibernate
ETIS SS04
19
Zusammenfassung
• Mapping von Klassen, Speichern und Suchen von
Objekten in Hibernate angeschaut
• Hibernate kann viel mehr (http://www.hibernate.org)
• Roundtrip Development:
Unterstützung für
Transformation
zu und von
Quellcode (java),
Mappingfiles (hbm)
und
DB Definition (ddl)
Hibernate
ETIS SS04
20
Literatur
• http://www.hibernate.org
• http://www.hibernate.org/hib_docs/reference/en/html/
• http://www.gloegl.de/8.html
Hibernate
ETIS SS04
21
Herunterladen