© DrHitch/Shutterstock.com
JPA 2.1

5 Schemagenerierung - Create, drop und load Scripts


Schemagenerierung ist der JPA-Bereich, in dem sehr viel passiert ist. Das liegt sicherlich daran, dass Schemagenerierung bisher in der JPA-Spezifikation nicht berücksichtigt wurde.

Schemagenerierung

Ermöglicht das Erzeugen von SQL-Skripten und das Laden von existierenden SQL-Skripten zur Erstellung des Datenbankschemas. Zudem wird das Laden von existierenden SQL-Skripten ermöglicht, die Stamm- oder Testdaten in die Datenbank laden. Darüber hinaus wird ein Schemagenerierungs-API bereitgestellt, um die Erweiterung programmatisch zu nutzen.

Das Problem in JPA 2.0

In der Persistenzschicht haben wir es mit Geschäftsobjekten wie z. B. Country, Flight, Order usw. zu tun, die aus der Geschäftsprozessmodellierung hervorgehen. Geschäftsobjekte werden in JPA zu Entities, repräsentiert durch Java-Klassen, angereichert durch Metadaten in Form von JPA-Annotationen wie @Entity, @Table usw. In der Welt der relationalen Datenbanken werden Geschäftsobjekte zu Relationen, repräsentiert durch Tabellen in einem Datenbankschema. Das Datenbankschema wird über SQL-Skripte mit DDL-Befehlen angelegt. Beide Welten sind unterschiedlich, wir sprechen vom Impedance Mismatch [1]. Für das Mapping zwischen den beiden Welten ist der O/R-Mapper, Bestandteil von JPA, zuständig.

Beginnen wir in der JPA-Welt und modellieren zunächst die Entities, aus denen dann ein Datenbankschema generiert wird, sprechen wir von Top-down – wir starten mit den Metadaten. Beginnen wir in der Datenbankwelt und modellieren zunächst unsere Tabellen, das Schema, und generieren daraus unsere Entities, sprechen wir von Bottom-up – wir starten mit dem SQL-Skript. Beginnen wir in beiden Welten, d. h. es gibt JPA-Entities und ein fertiges Datenbankschema, dann sprechen wir von Meet-in-the-Middle. Top-down und Meet-in-the-Middle sind die Entwicklungsansätze, die in der Praxis relevant sind und mit denen wir uns nun weiter beschäftigen werden.

Top-down

Beginnen wir mit Top-down, dann stellen sich folgende Fragen:

  1. Wie erzeuge ich aus den Metadaten ein Datenbankschema, also ein SQL-Skript, in dem die SQL-Befehle für das Erzeugen des Datenbankschemas enthalten sind?
  2. Wie wird für einen automatischen Test das SQL-Skript automatisch in die Datenbank geladen?
  3. Wie kann ich meine Testdaten in die Datenbank laden?

Meet-in-the-Middle

Bei dem Entwicklungsansatz Meet-in-the-Middle existiert das SQL-Skript bereits. Die Metadaten müssen so modelliert werden, dass Metadaten und SQL-Skript das gleiche Verhalten in beiden Welten abbilden. Die Modellierung der Metadaten erfolgt manuell, da die Metadatengenerierung nicht Gegenstand der JPA-2.0-Spezifikation ist.

Im Rahmen der Schemagenerierung stellen sich bei diesem Entwicklungsansatz nun noch folgende Fragen:

  1. Wie wird für einen automatischen Test das existierende SQL-Skript automatisch in die Datenbank geladen?
  2. Wie kann ich meine Testdaten in die Datenbank laden?

Auf all diese Fragen aus Top-down und Meet-in-the-Middle gibt JPA 2.0 keine Antwort. Die Schemagenerierung ist nicht Bestandteil der Spezifikation. Es gibt lediglich providerspezifische Lösungen, deren Funktionsumfänge aber nicht alle Fragestellungen abdecken. Die Aktivierung erfolgt über die Konfiguration in der persistence.xml. Listing 5.1 zeigt die Konfiguration für Hibernate.

<persistence-unit name="test">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>

<property name="hbm2ddl.auto" value="create"/>
</properties>

</persistence-unit>

Listing 5.1: Proprietäre Konfiguration für die Schemagenerierung in Hibernate

Die Lösung in JPA 2.1

Das Problem wurde erkannt und die Schemagenerierung in JPA 2.1 aufgenommen. Es wurde zum einen das API Persistence um die Methode generateSchema erweitert und eine Vielzahl von neuen Properties für die Konfiguration der Schemagenerierung in der persistence.xml aufgenommen. Wir schauen uns die Annotationen nun im Detail an und berücksichtigen dabei wieder die beiden Fälle Top-down und Meet-in-the-Middle. Eine detaillierte Beschreibung aller Attribute mit allen möglichen Einstellungen ist in der JPA-Spezifikation [2] zu finden.

Bevor wir beginnen können, muss die Datenbank bekannt gemacht werden, da die Befehle in den SQL-Skripten von Datenbank zu Datenbank leicht unterschiedlich ausfallen können. Listing 5.2 zeigt die Properties, die für die Definition der verwendeten Datenbank notwendig sind.

<property name="javax.persistence.database-product-name"
value="H2" />

<property name="javax.persistence.database-major-version"
value="1" />

<property name="javax.persistence.database-minor-version"
value="3" />

Listing 5.2: Datenbanktyp für Schemagenerierung festlegen

Top-down-Konfiguration

Es folgt nun die Konfiguration für den Top-down-Ansatz und den damit verbundenen Fragestellungen. Listing 5.3 zeigt die notwendige Property-Konfiguration in der persistence.xml

<property name="javax.persistence.schema-gen...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang