Training, Workshops, Softwareentwicklung

Hibernate Tutorial

Hibernate Setup

Hibernate wird meistens über eine XML-Datei namens persistence.xml konfiguriert. Diese muss laut JPA Spezifikation im Ordner META-INF im classpath liegen.

persistence.xml
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
             http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
             version="2.1">
    <persistence-unit name="default"> (1)
        <description>
            Persistence unit for Hibernate Training
        </description>
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <properties>

            (2)
            <property name="javax.persistence.jdbc.driver"
                      value="org.h2.Driver"/>
            <property name="javax.persistence.jdbc.url"
                      value="jdbc:h2:file:./target/database/db"/>
            <property name="javax.persistence.jdbc.user"
                      value="sa"/>
            <property name="javax.persistence.jdbc.password"
                      value=""/>

            (3)
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="hibernate.use_sql_comments" value="true"/>

            (4)
            <property name="hibernate.hbm2ddl.auto"
                      value="validate"/>

        </properties>
    </persistence-unit>
</persistence>
1 Dies ist der Name der Persistence Unit. Wir können davon mehrere konfigurieren.
2 Die ersten vier Parameter bestimmen die JDBC-Datenbankverbindung. (Treiber, Url, User, PW)
3 Diese Einstellungen sind beim Entwickeln sinnvoll. Hibernate gibt nun alle SQL-Befehle, die zur Datenbank gesendet werden, auf die Konsole aus
4 Die validate Einstellung für diesen Parameter veranlasst eine Prüfung unseres Datenbankschemas beim Start von Hibernate. Sollte etwas in unseren Entities nicht zur Datenbank passen, meldet Hibernate einen Fehler beim Start.

Die zentrale Klasse, mit der wir Hibernate an den Start bringen, implementiert das Interface EntityManagerFactory. Es gibt eine statische Hilfsmethode, mit der wir eine Instanz erzeugen können.

EntityManagerFactory erzeugen
emf = Persistence.createEntityManagerFactory("default");

Dies ist eine recht aufwändige Operation, die wir in aller Regel nur einmal beim Start unseres Systems durchführen.

Um tatsächlich einen Datenbankzugriff durchzuführen, erzeugt man sich mit Hilfe der EntityManagerFactory einen EntityManager. Für die Beispiele haben wir dazu eine Hilfsklasse mit statischen Methoden angelegt:

PersistenceHelper.java
public class PersistenceHelper {

    private static volatile EntityManagerFactory emf;

    public static EntityManagerFactory getEntityManagerFactory() {
        if (emf == null) {
            synchronized (PersistenceHelper.class) {
                if (emf == null) {
                    emf = Persistence.createEntityManagerFactory("default");
                }
            }
        }
        return emf;
    }

    public static EntityManager getEntityManager() {
        return getEntityManagerFactory().createEntityManager();
    }

}

Stimmt die Konfiguration, können wir nun einen ersten Test schreiben.

Ein erster Test
@Test
public void testFindCustomer() {

    EntityManager em = getEntityManager(); (1)
    try {
        Customer customer = em.find(Customer.class, 1L); (2)

        assertNotNull(customer);
        assertEquals("Buck", customer.getFirstname());
        assertEquals("Rogers", customer.getLastname());

    } catch (Exception x) {
        LOG.error("Persistence error", x);
    } finally {
        em.close(); (3)
    }
}
1 Dies ist die statische Methode aus unserer Helper-Klasse.
2 em.find() erwartet eine Klasse, die geladen werden soll und als zweiten Parameter den gewünschten Primary Key.
3 im finally schließen wir den EntityManager.