| home | suche | kontakt/johner | institut | hinweise studierende | tech-docs | blog | 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
- Datenbank herunterladen und anlegen
- Hibernate-Dateien runterladen von www.hibernate.org/6.html
- Hibernate Core
- Hibernate Annotations
- Neues Java-Projekt anlegen
- 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.
- In Eclipse alle diese Jars zum Build-Path hinzufügen
- rechter Mausklick auf das Projekt --> Properties
- Build-Path auswählen --> Libraries --> add Jars
- Datenbanktreiber ebenfalls zu Build-Path hinzugefügen
- MySQL: mysql-connector-java-<version>.jar
- HSQL: hsqldb.jar
- Klassen schreiben (siehe Beispiel)
- Default-Konstruktor ist notwendig
- Getter/setter auch!
- Klassen annotieren (javax.persistence imports wählen, nicht die von Hibernate)
- Annotationen für Attribute immer an getter!
- Id-Felder müssen numerisch sein
- 1:n-, n:m- und Vererbungsbeziehungen wie unten gezeigt
- Hibernate-Konfigurationsdatei anlegen (Beispiel anpassen)
- HibernateSessionFactory nehmen und evtl. anpassen
Anlegen der Datenbank
Nachdem die Konfiguration steht, hilft Hibernate beim automatischen Erstellen der Datenbanktabellen. Es gibt zwei Alternativen
- Ihr nutzt die Konfigurationsdatei wie vorgeschlagen einschließlich
<property name="hbm2ddl.auto">create</property>
- 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=" |
