210 likes | 308 Views
O/R - Mapper Hibernate. ETIS SS04. Gliederung. Motivation Architektur Persistente Klassen Mapping-Files Konfiguration und Datenbanken Ablauf der Anwendung Anfrage Zusammenfassung. Motivation (I). Impendance Mismatch : Kluft zwischen RDBMS und Objektorientierte Programmiersprachen
E N D
O/R - Mapper Hibernate ETIS SS04
Gliederung • Motivation • Architektur • Persistente Klassen • Mapping-Files • Konfiguration und Datenbanken • Ablauf der Anwendung • Anfrage • Zusammenfassung Hibernate
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
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
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
Architektur (I) Anwendung Transiente Objekte Persistente Objekte SessionFactory Transaktion Session ConnectionProvider TransactionFactory JNDI JDBC JTA Datenbank Hibernate
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
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
Persistente Klassen (I) • publicclass Serie { • private Integer id; • private String serie; • private Set comic = new HashSet(); • public Integer getId() { return id;} • //restliche getter-Methoden • publicvoid setId(Integer integer) { id = integer;} • //restliche setter-Methoden • } Hibernate
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 Hibernate
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
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
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
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 Hibernate
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
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
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
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
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
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
Literatur • http://www.hibernate.org • http://www.hibernate.org/hib_docs/reference/en/html/ • http://www.gloegl.de/8.html Hibernate