Enterprise-IT-PraktikumHibernate-Einführung
Institut für TelematikUniversität zu Lübeck
Wintersmester 2012/13Dennis BoldtDavid Gregorczyk
Institut für Telematik | Enterprise-IT-Praktikum
Enterprise-IT-Praktikum – Hibernate-Einführung 2
Hibernate…• Objekt/Relationale Persistenz und Abfrage• Abbildung zwischen
– Java Klassen <-> Datenbanktabellen– Java Datentypen <-> SQL Datentypen
Institut für Telematik | Enterprise-IT-Praktikum
Enterprise-IT-Praktikum – Hibernate-Einführung 3
Was bedeutet das?• Gängige Datenbanken verwenden als Modell
Entitäten und Relationen• Java verwendet als Modell Objekte• O/R Mapper bringt beide Welten zusammen• Stellt fertige Mechanismen bereit zur Abbildung
von der Objekt-Welt in die ER-Welt
Institut für Telematik | Enterprise-IT-Praktikum
Enterprise-IT-Praktikum – Hibernate-Einführung 4
Mappings konstruieren• Zwei Möglichkeiten, Java Klassen zu DB-Entitäten
zu mappen:1.XML-basiert (Dateien der Form *.hbm.xml)2.Annotations-basiert (z.B. @Entity)
Institut für Telematik | Enterprise-IT-Praktikum
Enterprise-IT-Praktikum – Hibernate-Einführung 5
Mappings konstruieren über XML• Erster Schritt: Klasse definieren• Zweiter Schritt: XML-Datei anlegen und
Relationen eintragenHibernate-XML-Datei:<hibernate-mapping package="de.uniluebeck.itm.eit.model"> <class name="Book" table="books"> <id name="id" column="book_id"> <generator class="native"/> </id> </class></hibernate-mapping>
Java-Klasse:class Book{ private Integer id; public getId() ... public setId(Integer id) ...}
Institut für Telematik | Enterprise-IT-Praktikum
Enterprise-IT-Praktikum – Hibernate-Einführung 6
Mappings konstruieren über Java-Annotationen• Erster Schritt: Klasse definieren• Zweiter Schritt: Annotationen einfügen
Annotationen:@Entity@Table(name = "books")class Book implements Serializable { @Id @GeneratedValue private Integer id; public getId() ... public setId(Integer id) ...}
Java-Klasse:class Book{ private Integer id; public getId() ... public setId(Integer id) ...}
Institut für Telematik | Enterprise-IT-Praktikum
Enterprise-IT-Praktikum – Hibernate-Einführung 7
Datenmodell• Einfache Java-Klassen (POJOs)• Zugriff nach Bean-Konventionen (Getter/Setter)
oder direkter Attributzugriff• Methoden und Attribute mit private & protected
möglich• Instanziierung im Applikationskern mit new• Implementierung des (parameterlosen) Default-
Konstruktors erforderlich• Hibernate unterstützt auch Collections
http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/collections.html
Institut für Telematik | Enterprise-IT-Praktikum
Ladestrategien• Lazy
Referenzierte Entitäten werden nur nach Bedarf geladen• Eager
Referenzierte Entitäten werden beim ersten Zugriff geladen
• Ladestrategien lassen sich auf Klassen-, Relationen, oder Query-Ebene anwenden
• Ermöglicht Einstellungen zur Performance-Optimierung• Mit Vorsicht und nur sehr bewusst einzusetzen, da
durch einen Eager-Zugriff im worst-case die gesamte Datenbank ausgelesen werden könnte!
Institut für Telematik | Enterprise-IT-Praktikum
Lebenszyklus einer Entität: die Hibernate Session• Session stellt die Objekt-Identität sicher
– Verwendet PK, so liefert load() zur selben ID immer dieselbe Instanz
– Generierten technischen Schlüssel aber nicht für Implementierung von equals() bzw. hashCode() verwenden! (erst mit flush() werden generierte IDs zugewiesen)
• Session hat Methoden zur Transaktionssteuerung• Session hat Factory-Methoden für Queries, z.B.
createQuery, getNamedQuery
Institut für Telematik | Enterprise-IT-Praktikum
Lebenszyklus einer Entität: die Hibernate Session
Institut für Telematik | Enterprise-IT-Praktikum
Hibernate-Beispiel: Transaktionssteuerung• Zunächst SessionFactory-Objekt generieren
Verschiedene Wege, dies zu erreichen…• Über die Session-Factory können Sessions generiert
und damit wiederum Transaktionen und Persistenzzugriffe gesteuert werden:
Session s = HibernateUtil.getSessionFactory().getCurrentSession();try{ s.beginTransaction(); s.save(new Book()); s.getTransaction().commit();} catch (Exception e){ s.getTransaction().rollback();}
Institut für Telematik | Enterprise-IT-Praktikum
Hibernate Startpunkte• http://docs.jboss.org/hibernate/core/3.6/quickstart/
en-US/html_single/• http://docs.jboss.org/hibernate/core/3.6/reference/
en-US/html_single/• http://docs.jboss.org/hibernate/entitymanager/3.6/
reference/en/html_single/