Hibernate (OR-Mapping)

Slides:



Advertisements
Ähnliche Präsentationen
Object Relational Mapping
Advertisements

Object Relational Mapping
Objektrelationales Mapping mit JPA
Objektrelationales Mapping mit JPA Advanced Topics Jonas Bandi Simon Martinelli.
DVG Einfache Klassen Einfache Klassen. DVG Einfache Klassen 2 Strukturen Beispiel: Personendaten bestehen aus –String name –String vorname.
JPQL Java Persistence Query Language
PKJ 2005/1 Stefan Dissmann Vorwoche - Klasse public class Studierende { private String name, vorname, studiengang; private int matNr, semester; private.
MySQL.
Java Beans von Raoul Schneider.
Objektrelationales Mapping mit JPA Working with Persistent Objects Jonas Bandi Simon Martinelli.
Objektrelationales Mapping mit JPA Getting Started Jonas Bandi Simon Martinelli.
Stefanie Selzer - Pascal Busch - Michael Kropiwoda
Java: Objektorientierte Programmierung
Java: Dynamische Datentypen
Listen Richard Göbel.
Java: Grundlagen der Objektorientierung
SQL als Abfragesprache
Benötigte Applets Startseite: in HTML-Format Applet auf der Startseite Das Applet, das auf der Startseite geladen wird, wird die vier Buttons und die eine.
IS: Datenbanken, © Till Hänisch 2000 CREATE TABLE Syntax: CREATE TABLE name ( coldef [, coldef] [, tableconstraints] ) coldef := name type [länge], [[NOT]NULL],
SQL/XML. © Prof. T. Kudraß, HTWK Leipzig 2 2 Motivation Speicherung von XML in allen großen kommerziellen DBMS vorhanden proprietäre Lösungen für die.
Christian Kästner Modellgetriebene Softwareentwicklung Eclipse Modelling Framework.
XDoclet ETIS SS05.
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Listen-
PKJ 2005/1 Stefan Dissmann Ausblick Es fehlen noch: Möglichkeiten zum Strukturieren größerer Programme Umgang mit variabler Zahl von Elementen Umgang mit.
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Bisher im Kurs erarbeitete Konzepte(1): Umgang mit einfachen Datentypen Umgang mit Feldern Umgang mit Referenzen.
PKJ 2005/1 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant Object.
Transaction Script Software Component Technology for Distributed Applications.
Datenintegrität Referentielle Integrität create table
JDBC -Java Database Connectivity-. 15./22. April 2004JDBC2 JDBC.... verbindet Java-Programme mit SQL-basierten Datenbanken.. liefert eine generische SQL-API.
07-GraphischeObjekte Graphische Objekte in EMMA301Paint.
DVG Klassen und Objekte
DVG Einfache Klassen 1 Einfache Klassen. 2DVG Einfache KlassenStrukturen Beispiel: Personendaten bestehen aus String name String name.
JDBC EDV JDBC.
3.5.2 Fremdschlüssel/ Referentielle Integrität (6/9)
Prof. K. Gremminger Folie 1 Vorlesung Datenbanksysteme SS 2002 Aufbau einer Verbindung zur Datenbank import java.net.URL; import java.sql.*; class JDBCExample.
Hänchen & Partner GmbH 1 Web-Anwendungen mit dem Jakarta Struts Framework 3.Juli 2003 Martin Burkhardt.
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
Die Persistenzschicht
SQL PHP und MySQL Referat von Katharina Stracke und Carina Berning
Wir bauen uns eine Webapplikation!
Programme dokumentieren mit JavaDoc
1 Sg 3 – JSP - Java Server Pages Softwareengineering Praktikum Java Server Pages Nicole Brandstätter Josef Sturm Karl Streicher.
Abteilung für Telekooperation Übung Softwareentwicklung 1 für Wirtschaftsinformatik Dr. Wieland Schwinger
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
HORIZONT 1 XINFO ® Das IT - Informationssystem Java Scanner HORIZONT Software für Rechenzentren Garmischer Str. 8 D München Tel ++49(0)89 / 540.
Betrieb von Datenbanken Marco Skulschus & Marcus Wiederstein Datenmanipulation Lehrbuch, Kapitel 4.
Grundlagen der Programmierung
Advanced Mapping Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.
Getting Started Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.
WS 2013/14 Datenbanksysteme Do 17:00 – 18:30 R Vorlesung #7 SQL (Teil 4)
HORIZONT 1 XINFO ® Das IT - Informationssystem PL/1 Scanner HORIZONT Software für Rechenzentren Garmischer Str. 8 D München Tel ++49(0)89 / 540.
Datenbanksysteme für hörer anderer Fachrichtungen
Referent: Stephan Metzler
JavaServer Faces Urs Frei. Inhalt JSF Funktionsweise Rückblick JSP Bestandteile von JSF So einfach ist die Anwendung (Beispiel) Eclipse im Einsatz (Entwicklungsumgebung)
Einfach und doppelt verkettete Listen in JAVA by Jens Weibler
EPROG Tutorium #4 Philipp Effenberger
Torque in Turbine Team 4 Josef Bohninger Thomas Lindenhofer
Torque robert.resch-wolfgang.schneider. uebersicht Was ist Torque Komponenten von Torque Generator Erzeugte Klassen Methoden Torque in Turbine Demobeispiel.
Analyseprodukte numerischer Modelle
Neuerungen in Java 5/6/7. Stefan Bühler für InfoPoint Überblick Java 5 neue Sprachfeatures Erweiterungen Klassenbibliothek Java 6 Erweiterungen.
Datenbankanbindung mit
Programmiervorkurs WS 2014/15 Methoden
Structured Query Language
Alois Schütte Advanced System Programming 2 Interprozeßkommunikation  2.1 JVM Ablaufumgebung  2.2 Java Native Interface (JNI)  Verwendung von.
O/R - Mapper Hibernate ETIS SS04. Hibernate 2 Gliederung Motivation Architektur Persistente Klassen Mapping-Files Konfiguration und Datenbanken Ablauf.
Enterprise-IT-Praktikum Hibernate-Einführung Institut für Telematik Universität zu Lübeck Wintersmester 2012/13 Dennis Boldt David Gregorczyk.
Datenbanken erstellen mit PostgreSQL
DOAG Regionaltreffen Trier/Saarland Verwendung von TopLink in J2EE Applikationen 09. September 2003 Marcus Keuper, Pfeil GmbH
 Präsentation transkript:

Hibernate (OR-Mapping) Roland Furrer Urs Frei

Inhalt Beispielanwendung Herkömmlicher Datenbankzugriff Hibernate Idee Bestandteile Collection Vererbung Datenbankabfragen Hibernate mit XDoclets Hibernate mit Annotationen

Beispielanwendung Benutzer * * Termine Termine Datum Uhrzeit Titel Beschreibung Person Kürzel Vorname Nachname

Herkömmlicher Datenbankzugriff JDBC update insert delete select create Connectionverwaltung Will man den SQL Zugriff selber programmieren so sind dies die wichtigsten Bestandteile an die man denken muss. Es geht auch einfacher!

Hibernate Idee Select Update Delete Insert Applikation Applikation DB Zugriff Hibernate Datenbank Datenbank Zugriff auf DB wird nicht mehr selber programmiert!!

Grundelemente Anwendung in Java Applikation Open-Source-Produkt unter www.hibernate.org Open-Source-Produkt HSQLDB unter www.hsqldb.org Applikation Hibernate Datenbank

Bestandteile der Beispielanwendung DB config File (xml) Definiert die Verbindung zur DB Art der DB Mapping File (xml) Welches Javaobjekt gehört zu welcher Tabelle Java Klassen (Java Beans)

Beispiel Hibernate Configfile <hibernate-configuration> <session-factory> <property name="dialect"> org.hibernate.dialect.HSQLDialect </property> <property name="connection.driver_class"> org.hsqldb.jdbcDriver <property name="connection.username"> sa <property name="connection.password"></property> <property name="connection.url"> jdbc:hsqldb:file:db/termine <mapping resource="net/sf/hibernatesample/einfach/Termin.hbm.xml" /> </session-factory> </hibernate-configuration>

Beispiel Hibernate Mappingfile <hibernate-mapping package= "net.sf.hibernatesample.einfach"> <class name="Termin"> <id name="id"> <generator class="native"/> </id> <property name="titel"/> <property name="beschreibung"/> <property name="zeitPunkt"/> <property name="ort"/> </class> </hibernate-mapping>

Beispiel Java-Klasse package net.sf.hibernatesample.einfach; import java.util.Date; public class Termin { private long id; private String titel; private String beschreibung; private String ort; private Date zeitPunkt; public String getTitel () { return titel; } public void setTitel (String titel) { this.titel = titel; } public Date getZeitPunkt () { return zeitPunkt; } public void setZeitPunkt (Date zeitPunkt) { this.zeitPunkt = zeitPunkt; } .....}

Tabellen mit Hibernate erzeugen Erzeugen der Tabelle in der Java-Anwendung: Configuration configuration = new Configuration().configure(); SchemaExport export = new SchemaExport(configuration); export.create(false, true); Resultierendes Statement für HSQLDB: create table Termin ( id bigint generated by default as indentity (start with 1), titel varchar(255), beschreibung varchar(255) zeitPunkt timestamp, ort varchar(255) primary key (id) )

Erzeugung eines persistenten Objekts private long erzeugeTermin(String titel, String beschreibung, String ort, Date zeitPunkt) { Termin termin = new Termin(); termin.setTitel(titel); termin.setBeschreibung(beschreibung); termin.setOrt(ort); termin.setZeitPunkt(zeitPunkt); Session session = null; Transaction transaction = null; try { session = sessionFactory.openSession(); transaction = session.beginTransaction(); session.save(termin); transaction.commit(); } catch (HibernateException e) { ... } .... return termin.getID();

Laden, suchen, aktualisieren, löschen eines persistenten Objekts Termin termin = (Termin) session.load(Termin.class, id); Suchen: Query query = session.createQuery("from Termin where ort=‘ " + ORT + “ ‘ "); List result = query.list(); Termin termin = (Termin) result.get(0); Aktualisieren: Transaction transaction = session.beginTransaction(); termin.setTitel("neuer Termin"); transaction.commit(); Löschen: session.delete(termin);

Details der Mapping-Dateien <hibernate-mapping package = "net.sf.hibernatesample.einfach"> <class name="Termin" table="termin"> <id name="id"> <generator class="native"/> </id> <property name="titel"/> <property name="beschreibung"/> <property name="zeitPunkt" column="zeit" type="timestamp" /> <property name="ort" type="string" length="40" /> </class> </hibernate-mapping>

Objekte als Klassenmember Wir ändern die Klasse Termin so, dass der Zeitpunkt nicht mehr in einem java.util.Date gespeichert wird, sondern in einem Zeitpunkt. public class Zeitpunkt { private int minute, stunde, tag , monat, jahr; .... //mit set- und get-Methoden } public class Termin { private Zeitpunkt zeit; ...//mit set- und get-Methode

Objekte als Klassenmember Die Mapping-Datei ändert sich nun wie folgt: <hibernate-mapping package = "net.sf.hibernatesample.einfach"> <class name="Termin" table="termin"> <id name="id"> <generator class="native"/> </id> <property name="titel"/> <property name="beschreibung"/> <component name="zeit"> <property name="minute" /> <property name="stunde" /> <property name="tag" /> <property name="monat" /> <property name="jahr" /> </component> <property name="ort" type="string" length="40" /> </class> </hibernate-mapping>

Umgang mit Collections Es soll nun möglich sein, einen Termin nicht an einem definierten Zeitpunkt abzuhalten sondern vorgängig alternative Zeitpunkte zu definieren: public class Termin { private List<Zeitpunkt> alternativZeiten = new ArrayList<Zeitpunkt>(); ...//mit set- und get-Methode } In der DB wird eine neue Tabelle ALT_ZEITPKT erzeugt. Die Tabelle hat einen Fremdschlüssel auf die Tabelle TERMIN. Ausserdem braucht die Tabelle eine Spalte LFD_NR, die für alle Elemente in der Liste festlegt, in welcher Reihenfolge sie stehen. ALT_ZEITPKT id lfd_nr Minute stunde tag monat jahr 1 2 22 18 6 2006 12 7 20

Umgang mit Collections Die Mapping-Datei sieht dann wie folgt aus: <hibernate-mapping package = "net.sf.hibernatesample.einfach"> <class name="Termin" table="termin"> ... <list name="alternativeZeiten" table="ALT_ZEITPKT"> <key column="id"/> <list-index column="lfd_nr"/> <composite-element class="hibtest.entity.Zeitpunkt"> <property name="minute" /> <property name="stunde" /> <property name="tag" /> <property name="monat" /> <property name="jahr" /> </composite-element> </list> .... </class> </hibernate-mapping> Mit Set, SortedSet, Map, SortedMap, etc. wird jeweils entsprechend verfahren.

Vererbung in Hibernate public abstract class Ressource { private long id; private String name; ...// set- und get-Methoden Ressource Raum Gegenstand public class Raum extends Ressource { private String gebaeude; ...// set- und get-Methode public class Gegenstand extends Ressource { private double wert; ...// set- und get-Methode

Vererbung in Hibernate Tabelle je Klassenhierarchie: Die ganze Vererbung in einer einzigen Tabelle! Ressource id disc name gebaeude wert 1 r Physikzimmer C1 2 g Beamer 2500.00 <class name=„Ressource"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <discriminator column=„disc“ type=„string“ lenght=„1“/> <subclass name=„Raum“ discriminator-value=„r“> <property name=„gebaeude“/> </subclass> <subclass name=„Gegenstand“ discriminator-value=„g“> <property name=„wert“/> </class>

Vererbung in Hibernate Tabelle je konkrete Klasse Raum id name gebaeude 1 Physikzimmer C1 Gegenstand Id name wert 2 Beamer 2500.00 <class name=„Ressource"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <union-subclass name=„Raum“ table=„raum“> <property name=„gebaeude“/> </union-subclass> <union-subclass name=„Gegenstand“> <property name=„wert“/> </class>

Vererbung in Hibernate Tabelle je Klasse Ressource id name 1 Physikzimmer 2 Beamer Raum id gebaeude 1 C1 <class name=„Ressource"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <joined-subclass name=„Raum“ table=„raum“> <key column=„id“ /> <property name=„gebaeude“/> </joined-subclass> <joined-subclass name=„Gegenstand“> <property name=„wert“/> </class> Gegenstand id wert 2 2500.00

Datenbankabfragen HQL sehr ähnlich SQL Query query = session.createQuery("from Termine"); List<Termin> alleTermine = query.list(); Criteria Criteria crit = session.createCriteria(Termin.class); crit.add(Restrictions.eq("ort", "Hamburg")); List<Termin> termine = criteria.list(); SQL auch möglich

Hibernate: Ziel erreicht? Vorteile Keine SQL Statements Problem Definitionsredundanz Java und XML Lösungsansätze XDoclet Annotationen

Hibernate mit XDoclet XDoclet: XML Mappingfile generieren Informationen für Generierung aus Javadoc

Hibernate mit XDoclet Bsp. Java /** * @hibernate.class */ public class Termin { private long id; … * @hibernate.property public String getTitel() { return titel;} public void setTitel(String titel) { this.titel = titel; } * hibernate.one-to-one * @hibernate.many-to-one public Benutzer getInitiator() { return initiator;} }

Hibernate mit XDoclet (3) Vor-Nachteile Vorteil: Mapping Infos näher bei Sourcen Einfacheres Ändern Konfiguration an einem Ort Nachteil: XML Mappingfile immer noch erforderlich Muss z.B. mit Ant generiert werden

Hibernate Annotationen Ermöglicht Metainformationen im Code Annotationsprozessoren bei Kompilierung In Reflection verwenden „Weiterentwicklung“ XDoclet In Java 1.5 enthalten

Hibernate Annotationen Bsp. @Entity public class Termin { private long id; … public String getTitel() { return titel;} public void setTitel(String titel) { this.titel = titel; } @ManyToOne(targetEntity = Benutzer.class) public Benutzer getInitiator() { return initiator;} } Jeder get als property betrachtet Propertykonfigurationen erfolgen auf get Nicht im Javadoc

Hibernate Annotationen Vor-Nachteil Vorteil: Kein XML Mappingfile mehr Nachteil: Java 1.5 wird benötigt. Nachteil?

Warum Hibernate einsetzen? Bsp. Programmieraufwand für eine Tabelle Hibernate JDBC @Entity Create Table Select Insert Delete 1 Codezeile xxx Codezeilen Es funktioniert Funktioniert es????

Referenzen Hibernate www.dpunkt.de ISBN 3-89864-371-9 www.hibernate.org java.sun.com www.hsqldb.org http://xdoclet.sourceforge.net/xdoclet/index.html