Flyway in Hibernate und JPA integrieren

Keine Frage, eine ordentliche Datenbank-Versionierung mit automatischer Migration auf das jeweils zur Anwendungsversion passende Schema muss sein. Unser Mittel der Wahl ist dazu meistens Flyway. Wenn es darum geht, Flyway in eine Server-Anwendung die Hibernate verwendet zu integrieren, steht man aber zunächst etwas verloren da. Flyway selbst bringt nichts mit und die Doku schweigt sich zum Thema aus. Die folgenden Codeschnippsel zeigen, wie es geht.

Zunächst mal muss natürlich alles für Flyway vorbereitet sein: die Migrations-Skripte sind in einem Package versammelt und Flyway steht im Classpath bereit.
Falls Sie noch nie mit Flyway gearbeitet haben, finden Sie hier eine kurze Einführung.

Als wichtigste Aufgabe muss jetzt dafür gesorgt werden, dass die Datenbank-Migration ausgeführt wird, bevor Hibernate anfängt das Schema zu validieren. Glücklicherweise bringt Hibernate dazu einen passenden, aber leider schlecht dokumentierten, Mechanismus mit. Wird ein „Integrator“ an der passenden Stelle registriert, wird dieser während Hibernate seine Session-Factory erzeugt aufgerufen und kann beliebige Aktionen durchführen. Genau an dieser Stelle greifen wir ein.

Dazu legen wir zunächst eine eigene Integrator-Implementierung an. Der passende Code sollte in etwa so aussehen:

 

Der eigentliche Trick steckt in den Zeilen 37 und 38. Hibernate bzw. JPA lassen zwar einen Zugriff auf JDBC-Connections, nicht aber auf die dahinterliegende DataSource zu. Diese wird für Flyway aber unbedingt gebraucht. Mit ein bisschen sanfter Reflection-Gewalt kommt man zum Glück trotzdem dran.

Danach muss nur noch Flyway instantiiert, konfiguriert und gestartet werden.

Bevor die Anwendung jetzt ausgeführt werden kann, muss der Integrator noch registriert werden. Dies geschieht in der Datei „org.hibernate.integrator.spi.Integrator“, die im Order META-INF/services liegen muss.

Integrator registrieren

Der Inhalt der Datei besteht einfach aus dem vollständigen Namen der Integrator-Klasse.

Nach einer kurzen Überprüfung ob in der persistence.xml „hibernate.hbm2ddl.auto“ auch auf „validate“ gestellt ist (schließlich soll Hibernate nicht selbst am Schema herumbasteln) steht dem Deployment der Anwendung nichts mehr im Weg.

Veröffentlicht in Java, Softwareentwicklung Getagged mit: , , , , , , , , ,
3 commenti su “Flyway in Hibernate und JPA integrieren
  1. Gatschet sagt:

    Leider ist die Funktion sessionFactory.getConnectionProvider() in Hibernate 4.3 deprecated und funktioniert nicht mehr. Irgend eine Ahnung, wie ich dennoch zur DataSource komme?

    • Oliver Baumann sagt:

      Für den Fall, dass sich jemand noch für die Antwort interessiert:
      Hibernate gibt in der Dokumentation an, dass anstelle von getConnectionProvider() getJdbcConnectionAccess() verwendet werden soll. Über getJdbcConnectionAccess() kann man ebenfalls das Connection-Objekt erhalten.

    • Miro sagt:

      DataSource dataSource = (DataSource) sessionFactory.getProperties().get( „javax.persistence.jtaDataSource“ );

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

*

* Copy This Password *

* Type Or Paste Password Here *