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