home  |  suche  |  kontakt/johner  |  institut 
studierende  |  tech-docs  |  mindmailer 

Hibernate Tutorial

Hibernate stellt eine weitere Alternative zu JDBC und JDO für die Datenspeicherung dar. Ähnlich wie JDO können "Plain Old Java Objects" gespeichert werden, ohne dass man - wie bei JDBC - die Attribute einzeln aus den Objekten auslesen und dann mit SQL-Befehlen abspeichern muss.

Der neue EJB 3.0 Standard hat sehr große Ähnlichkeit mit Hibernate.

Um ein Java-Objekt zu speichern, bedarf es nur weniger Zeilen Code.

 

Session session = HibernateSessionFactory.currentSession();
Transaction tx = session.beginTransaction();
User user = new User(name);
session.saveOrUpdate(user);
tx.commit();

 

Ihr findet hier ein komplettes, lauffähiges Beispiel.

Für Eilige: Das Hibernate-Kochbuch

Vorbereitung

  1. Datenbank herunterladen und anlegen

    • http://www.mysql.org
    • http://hsqldb.org

  2. Entweder mit Maven Hibernate-Dateien runterladen (Beispiel für pom.xml) oder von Hand von www.hibernate.org/6.html

    • Hibernate Core
    • Hibernate Annotations

  3. Neues Java-Projekt anlegen
  4. Falls mit Maven gearbeitet wird: entweder auf der Kommandozeile im Projektordner mvn eclipse:eclipse ausführen oder über das Maven-Eclipse-Plugin über "Run as..." "Install" ausführen.
  5. Falls nicht mit Maven gearbeitet wird:

    1. Im Java-Projekt lib-Ordner anlegen und Hibernate jars hineinkopieren. Wichtig: Fügen Sie sowohl die jar-Dateien, die direkt im Root liegen, als auch diejenigen, die im lib-Folder der Zip-Datei sind, in den lib-Folder ihres Projekts. Bitte löschen Sie alle eventuell vorhandenen alten Hibernate jars! Das ist wichtig, weil man sonst Hibernate nicht zum Laufen bekommt oder keine Debug-Ausgabe sieht, was das Arbeiten fast unmöglich macht.
    2. In Eclipse alle diese Jars zum Build-Path hinzufügen

      • rechter Mausklick auf das Projekt --> Properties
      • Build-Path auswählen --> Libraries --> add Jars

    3. Datenbanktreiber ebenfalls zu Build-Path hinzugefügen

      • MySQL: mysql-connector-java-<version>.jar
      • HSQL: hsqldb.jar

  6. Klassen schreiben (siehe Beispiel)

    • Default-Konstruktor ist notwendig
    • Getter/setter auch!

  7. Klassen annotieren (javax.persistence imports wählen, nicht die von Hibernate)

    • Annotationen für Attribute immer an getter oder an Attribute!
    • Id-Felder müssen numerisch sein
    • 1:n-, n:m- und Vererbungsbeziehungen wie unten gezeigt

  8. Hibernate-Konfigurationsdatei anlegen (Beispiel anpassen)
  9. HibernateSessionFactory nehmen und evtl. anpassen

Anlegen der Datenbank

Nachdem die Konfiguration steht, hilft Hibernate beim automatischen Erstellen der Datenbanktabellen. Es gibt zwei Alternativen

  1. Ihr nutzt die Konfigurationsdatei wie vorgeschlagen einschließlich

    <property name="hbm2ddl.auto">create-drop</property>

  2. Oder ihr ruft folgendes Programm auf:
package de.fhkn.sem6.fifa;
import org.hibernate.tool.hbm2ddl.SchemaUpdate;
public class GenerateDDLStatements {
 public static void main(String[] args) {
  SchemaUpdate su = new SchemaUpdate(HibernateSessionFactory.getCfg());
  su.execute(true, true);
 }
}

 

 

Arbeiten mit Hibernate

Wie man Objekte speichert, haben wir bereits in der Einführung kurz gezeigt. Nun laden wir Objekte wieder aus der Datenbank.

 

a) Mit Primärschlüssel laden

 

User user = (User)session.load(User.class, "Hans");

 

"Hans" sei hier der Primärschlüssel und session die HibernateSession.

 

b) Laden mit Query

 

Query query = session.createQuery(
   "from User as u where u.loginname = ?");
query.setString(0, "Gerda")
List<User> users =  query.list();

 

 

0 steht für den 0. Parameter in der Abfrage (Informatiker beginnen bei 0 zu zählen). Alternativ hätte man auch mit einem Iterator weiter arbeiten können:

 

 

Iterator<User> iterator = query.createIteator();

 

 

Annotationen

Annotation Ort Wert Kommentar
Entity Klasse name (Bsp. s.o.)
Table Klasse name (Bsp. s.o.)
Id Attribut -- (Bsp. s.o.)
GeneratedValue Attribut strategy (Bsp. s.o.)
Column Attribut name (Bsp. s.o.)
Attribut precision = 6, scale = 2 Bei numerischen Werten
Attribut Length = 63 Bei Strings (default = 255)
Attribut nullable = false Default = true
Attribut Unique = true Default = false
Basic Attribut optional (true/false Muss das Attribut gesetzt sein?
Transient Attribut -- Attribut wird nicht gespeichert
Enumerated Attribut EnumType.STRING, EnumType.ORDINAL Für Eumerations. Keine Zuordnung über value = XY notwendig
Temporal Attribut TemporalType.TIMESTAMP bzw. DATE bzw. TIME Bei Date werten
Lob Attribut -- BLOB
OneToMany Attribut mappedBy = "kunde" Auf der "1-er" Klasse. Mappedby ist Name des Attributs (Fremdschlüssels auf N-er Seite)
cascade = CascadeType.ALL
OrderBy Attribut bestellnr asc, datum desc Benötigt kein "value="