Freitag, 29. November 2013

JPA-Schema-Export mit Hibernate

Die Hibernate-Tools bieten mit den Klassen SchemaExport und SchemaUpdate die Möglichkeit, das Datenbank-Schema (Tabellen, Indizes, Fremdschlüssel-Constraints etc.) aus den Mapping-Informationen des Datenmodells zu generieren. Da es sich um Hibernate-spezifische API handelt, wird von den Klassen eine Hibernate-Configuration erwartet. Mit Hilfe der kleinen, von Hibernate nicht offiziell unterstützten (und mittlerweile auf "deprecated" gesetzten) Klasse Ejb3Configuration kann aber auch eine Java-Persistence-Konfigurationsdatei persistence.xml eingelesen werden:

import org.hibernate.cfg.Configuration;
import org.hibernate.ejb.Ejb3Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.hibernate.tool.hbm2ddl.SchemaUpdate;

...

Configuration cfg =
   new Ejb3Configuration()
        .configure("name-der-persistence-unit", null)
        .getHibernateConfiguration();

Mit der ermittelten Configuration kann nun das komplette Schema ...

SchemaExport schemaExport = new SchemaExport(cfg);

schemaExport.setOutputFile("schema-komplett.sql");

schemaExport.create(true, false);

... oder aber nur die Differenz zum aktuell in der Datenbank vorhandenen Schema ermittelt werden:

SchemaUpdate schemaUpdate = new SchemaUpdate(cfg);

schemaUpdate.setOutputFile("schema-diff.sql");

schemaUpdate.execute(true, false);

Das true beim jeweils letzten Aufruf sorgt dafür, dass das SQL-Skript in die angegebene Datei geschrieben wird. Das false verhindert, dass die SQL-Anweisungen in der Datenbank ausgeführt werden.

Im kommenden Hibernate 4.3, das die JPA-2.1-Spezifikation implementiert, wird Ejb3Configuration nicht mehr enthalten sein. Dann muss bzw. kann endlich die mit JPA 2.1 standardisierte Schema-Generierung verwendet werden.