Hibernate
Transcription
Hibernate
Hibernate ¾ ¾ ¾ Vortragender : Nabil Janah Kursleiter : Prof. Dr. Björn j Dreher Lehrveranstaltung : Komponenten-Architekturen Nabil janah 1 Hibernate Inhalt Hibernate Hib t allgemeines ll i Vorteile von Hibernate Hibernate-Architektur Persistency-Lifecycle Konfiguration . Konfiguration mit Annotations . Konfiguration mit XML – Mappingdateien . hibernate.cfg.xml Ablauf einer Transaktion Abfragen . Abfragen g (1) ( ) – Natives SQL Q . Abfragen (2) – HQL . Abfragen (3) – Criteria API Nabil janah 2 Hibernate Hibernate allgemeines Hibernate ist ein Open-Source-Persistenz-Framework für Java Das Framework ermöglicht es, den Zustand eines Objekts in einer relationalen Datenbank zu speichern und aus entsprechenden Datensätzen wiederum Objekte zu erzeugen, ohne die DB-Zugriffe explizit in SQL programmieren zu müssen. Diese Funktionalität bezeichnet man auch als Object-Relational Mapping (O-RMapping, kurz ORM), sie befreit den Entwickler von der Programmierung von SQL-Abfragen und hält die Applikation unabhängig vom SQL-Dialekt der verwendeten Datenbank. Datenbank Bei den Objekten handelt es sich um gewöhnliche Objekte mit Attributen und Methoden (im Java-Bereich POJOs genannt). Beziehungen zwischen Objekten werden auf entsprechende DatenbankRelationen abgebildet. Die Abfrage der persistierten Objekte erfolgt über die SQL-ähnliche Abfragesprache Hibernate Query Language (HQL), ausprogrammiert mittels j Criteria-API oder direkt per SQL. der objektorientierten Nabil janah 3 Hibernate Vorteile von Hibernate Es ist das Open-Source Persistenz-Framework der Wahl mit enormer Verbreitung, sehr aktiver Entwicklung und grosser Community . D t b k U bhä i k it (es Datenbank-Unabhängigkeit ( werden d zahlreiche hl i h DBMS und d deren d SQLDialekte SQLDi l kt unterstützt) . Nicht intrusiv (keine Ableitung eigener Klassen von Hibernate-Klassen erforderlich) . Lässt dem Entwickler g grösstmögliche g Freiheit bei der Anwendungserstellung g g und ist äusserst flexibel einsetzbar. Unterstützung durch Zusatzpakete (z.B.Annotations, EntityManager) und zahlreiche Tools (z.B. für ANT und Eclipse) . Sehr gute Literatur verfügbar . Nabil janah 4 Hibernate Hibernate-Architektur Hibernate-Mapping : Die Grundidee von O/R-Mapping ist, objektorientierte Klassen und ihre Eigenschaften auf Tabellen und Spalten einer relationalen Datenbank abzubilden. Vereinfacht gesagt gesagt, stellt ein O/R-Mapper einen Datensatz aus der Datenbank durch ein entsprechendes Objekt dar. Indem wir Änderungen g am Objekt j vornehmen, manipulieren wir letztlich den entsprechenden Inhalt einer Datenzeile. Nabil janah 5 Hibernate Hibernate-Architektur Persistente Klassen (POJOs/JavaBeans) : Die persistenten Di i t t Kl Klassen spielen i l bei b i einem O/R-Mapper eine zentrale Rolle, obwohl sie vom Aufbau sehr einfach sind. Sie enthalten oftmals nur eine Sammlung von Eigenschaften und entsprechenden Getter- und Setter-Methoden. Diese Klassen enthalten die Daten, die in der Datenbank gespeichert werden soll und stellen somit unser Domain-Modell dar. Nabil janah 6 Hibernate Hibernate-Architektur Die Hibernate-Session: Die Hibernate-Session ist für den Entwickler die primäre Schnittstelle (Primary API) zu Hibernate. Mithilfe der Session können Objekte aus der Datenbank gelesen bzw. Änderungen an Objekten persistiert werden. Nabil janah 7 Hibernate Hibernate-Architektur Die Hibernate-Session: Hibernate Session: Die folgende Tabelle zeigt einige Operationen, die über eine Session ausgelöst werden können: Neben der Funktion als Bindeglied zwischen der Datenbank und unserer Anwendung stellt die Session auch eine Factory für Transaction-Instanzen bereit. Gleichzeitig ist eine konkrete Session-Instanz nicht thread-safe und darf nur von einem Thread verwendet werden. Nabil janah 8 Hibernate Hibernate-Architektur Hibernate-Session-Factory: Die SessionFactory Di S i F t lädt und d hält alle ll O/R-Mappings. Sie ist der Erzeuger der bereits erwähnten Session-Klasse. Im Gegensatz zur Session enthält unsere Anwendung genau eine SessionFactory, die als thread-safe und unveränderlich angesehen werden kann.Das bedeutet , dass die SessionFactory beim Start der Anwendung einmalig instanziiert und konfiguriert wird. Die dafür notwendige Konfiguration sollte im Klassenpfad als Property-Datei als XML-Datei (z. B. hibernate.cfg.xml) vorliegen. Innerhalb dieser Datei werden die Datenbank Datenbank-Verbindung Verbindung sowie verschiedene weitere Einstellungen konfiguriert, was wir uns in der Folge noch genauer ansehen werden. Nabil janah 9 Hibernate Persistency-Lifecycle Die Objekte, die der Hibernate-Session noch nicht bekannt sind, z. B. weil sie gerade mit dem new-Operator erzeugt worden sind, werden als transiente Objekte bezeichnet. Nabil janah 10 Hibernate Persistency-Lifecycle Die Objekte, die Hibernate in der aktuellen Session bekannt sind, werden als persistente Objekte b bezeichnet. i h t Sie Si haben h b eine i Repräsentation in der Datenbank Und einen Wert für ihren Primärschlüssel Nabil janah 11 Hibernate Persistency-Lifecycle Ein persistentes Objekt kann von der Hibernate-Session wieder getrennt werden.In d I diesemFall di F ll sprichtman i ht von einem detached Objekt. Nabil janah 12 Hibernate Konfiguration mit Annotations @Entity public class Item { @Id @Gene @GeneratedValue(strategy=GenerationType.AUTO) atedVal e(st ateg Gene ationT pe AUTO) protected long SKU; @Column(name=“description”) protected t t d St String i d description; i ti @Column(name=“name”) protected String name; @Column(name=“category”) l ( “ ”) protected String category; public Item() {} // Getter und Setter ... } Nabil janah 13 Hibernate XML – Mappingdateien (1) <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <class name =" Item" > <id name =“SKU" type yp =" long"> g <column name =“SKU" /> <generator class =" auto" /> </id / > <property name =“description " type =" string “> <column name =" description " length =“100" /> </ property > ... Nabil janah 14 Hibernate und mit XML – Mappingdateien (2) <property name =“ name" type =" string “> <column name =“name " length ="30" /> </ property > <property p p y name =“category" g y type yp =" string„> g <column name =“category " /> </ property > <version name=“version“ access=“field“ column=“version“/> / </ class > </ hibernate-mapping > Nabil janah 15 Hibernate hibernate.cfg.xml (1) <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> p // g / g <hibernate-configuration> <session-factory> </session-factory> / y </hibernate-configuration> Nabil janah 16 Hibernate hibernate.cfg.xml (2) <property name="connection.driver_class“>drivername</prope <property name="connection.url“>jdbc:hsqldb:hsql://localhost:5432/test</property> <property name="connection.username“>username</property> <property name="connection.password“>passwort</property> <property name="dialect“> SQLDialectname </property> <property name="show_sql">true</property> <property name="hibernate.format_sql">true</property> <mapping class ="classenname"/> Nabil janah 17 Hibernate Ablauf einer Transaktion AnnotationConfiguration configuration = new AnnotationConfiguration(); SessionFactory sessionFactory = configuration.configure().buildSessionFactory(); f f () b ld () Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); try { //Aktionen mit der Session durchführen Transaction.commit(); session.close(); } catch (Throwable t) { Transaction.rollback(); Throw t; }fi ll { }finally{ Sesssion.close(); } Nabil janah 18 Hibernate Abfragen (1) – Natives SQL - Unterstützung der SQL – Syntax - Funktioniert ähnlich wie Abfragen mit JDBC Beispiel: p List l = session.createSQLQuery( “select * from item where item.name = ‘HardDrive120‘ ).list(); Nabil janah 19 Hibernate Abfragen (2) - HQL - Hibernate Query Language ist ein objektorientiertes SQL - Beinhaltet fast alle Möglichkeiten, die auch SQL bietet Beispiel: List l = session.createQuery( Q y( ”from Item i where i.name= ‘HardDrive120’).list(); Nabil janah 20 Hibernate Abfragen (3) – Criteria API - API zur Programmatischen Erzeugung von Abfragen - Deutlich komfortabler als Manipulation von Stringqueries - Funktionsumfang entspricht HQL Beispiel: List<Item> workers= ((List<Item>)) session. createCriteria(Item.class) . add( Restrictions.or( Restrictions.and(( Restrictions.like("lastName", "Kin%"), Restrictions.eq("firstName", "Garvin")), Restrictions.gt("salary", 2000F)) ) .list(); Nabil janah 21 Hibernate Referenzen Hibernate www.dpunkt.de ISBN 389864-371-9 www hibernate org www.hibernate.org java.sun.com www.wikipedia.de Nabil janah 22 Hibernate Hibernate Nabil janah 23 Hibernate