ETIS SS04 Hibernate 2
Gliederung• Motivation
• Architektur
• Persistente Klassen
• Mapping-Files
• Konfiguration und Datenbanken
• Ablauf der Anwendung
• Anfrage
• Zusammenfassung
ETIS SS04 Hibernate 3
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
ETIS SS04 Hibernate 4
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
ETIS SS04 Hibernate 5
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…)
ETIS SS04 Hibernate 6
Architektur (I)
Transiente Objekte
Persistente Objekte
Anwendung
TransaktionSession
SessionFactory
TransactionFactory ConnectionProvider
JNDI JDBC JTA
Datenbank
ETIS SS04 Hibernate 7
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
ETIS SS04 Hibernate 8
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
ETIS SS04 Hibernate 9
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 }
ETIS SS04 Hibernate 10
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 Bytecode-
Manipulation) – keine Abhängigkeit von Hibernate in der POJO-Klasse
ETIS SS04 Hibernate 11
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>
ETIS SS04 Hibernate 12
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
ETIS SS04 Hibernate 13
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>
ETIS SS04 Hibernate 14
Konfiguration und Datenbank (II)• Properties mit Präfix connection
– notwendige Konfiguration zum Aufbau einer JDBC-Verbindung
• 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
ETIS SS04 Hibernate 15
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();
ETIS SS04 Hibernate 16
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(); }}
ETIS SS04 Hibernate 17
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)
ETIS SS04 Hibernate 18
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(); }
ETIS SS04 Hibernate 19
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
ETIS SS04 Hibernate 20
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)