Hibernate Architektur
Das Hibernate-Framework schafft eine Verbindung zwischen
relationaler-Datenbanktabelle und Java-POJO-Klasse.
Dabei stellt eine XML-Konfigurationsdatei den Mittelpunkt für
die Verknüpfung dar. In dieser finden sich Informationen über entsprechende
Tabellen sowie die POJO-Klassen und deren Felder. Die Verbindung zwischen
Java-Klasse und relationaler Tabelle wird als Binding bezeichnet.
Abbildung 13 zeigt den Aufbau einer relationalen Datenbanktabelle,
in der Benutzerinformationen abgelegt werden können:
Abbildung 13: Relationale Datenbanktabelle mit 3 Feldern
Quelle: Eigene Darstellung
Parallel zu der Datenbanktabelle existiert eine Java-Klasse,
welche die Inhalte der Felder der Datenbanktabelle aufnehmen kann.
package de;
/**
* * Business-Objekt für den Benutzer. * *
*
* @author Fabian Rossbacher *
*/
public class Benutzer {
/**
* Die eindeutige ID des Benutzers
*/
private Long id;
/**
* Das Passwort des Benutzers
*/
private String passwort;
/**
* Die Email-Adresse des Benutzers
*/
private String email;
/**
* Datum der Erstellung des Benutzers
*/
private Date datum;
// Getter/Setter
}
Abbildung 14: Java-POJO-Klasse für die Speicherung von Benutzerdaten
Quelle: Eigene Darstellung
Aufgabe von Hibernate ist es nun, eine
Verbindung zwischen der Datenbanktabelle und der Javaklasse zu knüpfen.
Hierfür wird ein XML-Mapping in der Hibernate-Mapping-Sprache erstellt.
Dieses wird von Hibernate genutzt, um
Daten aus der relationalen Datenbanktabelle zu lesen, die entsprechenden
Werte in die Felder der Javaklasse zu schreiben und sie dem
Benutzer zur Verfügung zu stellen. Die
Informationen aus dem Mapping können aber auch für den umgekehrten Weg genutzt
werden: Daten innerhalb der POJO-Klassen können über
die Hibernate-Funktion „saveOrUpdate“ in die Datenbank übertragen werden.
Die Methode „delete“ löscht einen Datensatz anhand der eindeutigen ID in der
Javaklasse. Abbildung 15 zeigt eine Mapping-Konfiguration,
welche die in vorangegangenen Abbildungen aufgeführten Elemente miteinander verbindet:
<?xml version="1.0"?>
<hibernate-mapping>
<class name="de.Benutzer" table="benutzerTabele">
<id name="id" column="id" type="long" />
<property name="passwort" column="passwort" />
<property name="email" column="email" />
<property name="datum" column="datum" />
</class>
</hibernate-mapping>
Abbildung 15: Hibernate XML-Mapping
Quelle: Eigene Darstellung
Eingeleitet wird das Mapping mit dem öffnenden Tag „hibernate-mapping“.
In diesem wird für jede gemappte Javaklasse ein weiteres Tag mit dem
Namen „class“ erstellt. Als Attribut muss der Name der Java-Klasse plus
Package sowie der Name der Datenbanktabelle eingetragen werden.
Innerhalb des „class“-Knotens erfolgt mittels des „Property“-Tags die
eigentliche Verknüpfung zwischen dem Feld in der Datenbanktabelle und
der Java-Klasse. Eine Besonderheit stellt das Feld für den Primärschlüssel dar.
Dieser wird mit dem Tag „id“ gekennzeichnet.
Um die eigentliche Datenbankverbindung sowie die gewünschten Mapping-Files festzulegen,
wird zusätzlich eine „Hibernate-Konfiguration“ erstellt. In dieser können neben der
Datenbankverbindung auch Informationen über Timeouts, die maximale Anzahl von Zugriffen
und den Treiber für die Datenbank selbst hinterlegt werden.
Die folgende Tabelle zeigt eine „Hibernate-Konfiguration“ für eine
Verbindung auf eine Postgres-Datenbank und dem zuvor erstellten XML-Mapping:
<?xml version='1.0' encoding='utf-8'?>
<hibernate-configuration>
<session-factory name="java:comp/env/hibernate/SessionFactory">
<! —properties --
<property name="hibernate.connection.driver_class">
org.postgresql.Driver
</property>
<property name="hibernate.connection.url">
jdbc:postgresql:benutzerDatenbank
</property>
<property name="hibernate.connection.username">
username
</property>
<property name="hibernate.connection.password">
passwort
</property><!-- mapping files -->
<mapping resource="Benutzer.hbm.xml" />
</session-factory>
</hibernate-configuration>
Abbildung 16: Hibernate-Konfiguration
Quelle: Eigene Darstellung
Für jede Datenbankverbindung wird ein „session-factory“-Tag angelegt.
Als Parameter dient ein eindeutiger Name, welcher in der eigentlichen
Anwendung für den Verbindungsaufbau genutzt wird. Treiberklasse, Datenbankname,
Benutzer und Passwort werden über „Property“-Tags konfiguriert.
Die gewünschten Mappings werden mittels des „Mapping“-Tags eingetragen.