2015-03-25 17 views
11

Ich versuche Flyway für Migrationen in einem Spring Boot-Projekt mit Hibernate und Spring JPA zu integrieren. Ich erhalte die folgende Ausnahme:Integration von Flyway und Spring Boot

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flyway' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Invocation of init method failed; nested exception is org.flywaydb.core.api.FlywayException: Found non-empty schema "PUBLIC" without metadata table! Use init() or set initOnMigrate to true to initialize the metadata table. 

Mein pom.xml sucht wie folgt aus:

<dependency> 
    <groupId>org.flywaydb</groupId> 
    <artifactId>flyway-core</artifactId> 
    <version>3.2</version> 
</dependency> 

Ich verwende Hibernate und eine Config-Java-Datei für Postgres (dev Stufe) und h2 (lokal). Die Unterschriften sehen so aus:

@Bean(initMethod = "migrate") 
    public Flyway flyway() { 
    Flyway fly = new Flyway(); 
    fly.clean(); 
    fly.init(); 
    //flyway.setInitOnMigrate(true); 
    fly.setSchemas("SBA_DIALOG"); 
    //flyway.setLocations("filesystem:src/main/resources/db/migration"); 
    fly.setDataSource(this.dataSource()); 
    fly.migrate(); 
    return fly; 
    } 
@Bean(name = "sbaEntityManagerFactory") @DependsOn("flyway") 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 
... 

Ich kann nichts über mein in dieser Frage beschriebenes Problem finden. Kann jemand helfen?

+2

Spring Boot unterstützt bereits flyway das einzige was du brauchst ist addway als abhängigkeit ... Ich empfehle eine Lektüre des [manual] (http://docs.spring.io/spring-boot/docs/current/ Referenz/html/Howto-Datenbank-Initialisierung.html # Howto-Ausführen-Flyway-Datenbank-Migrationen-beim Start) und für die [Konfigurationseigenschaften] (http://docs.spring.io/spring-boot/docs/ Aktuell/Verweis/html/common-application-properties.html). Für mich sieht es so aus, als würden Sie booten und versuchen Sie sehr hart um es herum zu arbeiten (explizit alles für Beispiel zu konfigurieren). –

+0

ganz komisch: Spring Boot sollte nicht die automatische Konfiguration von Flyway starten, wenn Sie die Flyway für sich konfigurieren (Frage ist, ob es notwendig ist). Der Fehler kommt jedoch von der Boot-Autokonfiguration. Versuchen Sie jedoch, "flyway.initOnMigrate = true" zu Ihrer application.properties hinzuzufügen und entfernen Sie Ihre eigene Flyway-Initialisierung :) – sodik

+0

thx für die Treffer. – imalik8088

Antwort

36

Spring-Boot ist in der Lage, dies zu tun. Fügen Sie Ihrem Projekt nur eine Flyway als Abhängigkeit hinzu, und Spring-Boot wird es aufnehmen. Die Flyway-Migration wird gestartet, wenn der Service gestartet wird.

Wenn Sie bereits einige Tabellen in der Datenbank hinzufügen:

flyway.baseline-on-migrate=true 

in Ihrer Eigenschaft Datei flyway ruhig zu halten, wenn es entdeckt, dass einige Tabellen bereits existieren. ;-)

Flyway sollte Ihre Datenquelle abholen. Wenn Sie einen anderen Benutzer oder so ähnlich für flyway zum Beispiel benötigen, können Sie diese Eigenschaften festlegen:

flyway.url: jdbc:postgresql://${db.host}/${db.name} 
flyway.user: MYUSER 
flyway.password: MYPWD 

(! Natürlich fügen Sie Ihre Werte Sie können SPEL verwenden, um andere Eigenschaften zu verweisen)

aktualisieren

Ein Wort der Warnung: Wenn Sie eine Cluster-Datenbank verwenden, können Probleme auftreten, dass mehrere gleichzeitig gestartete Instanzen versuchen, die Aktualisierungen gleichzeitig auszuführen. Dies ist ein Problem, wenn die Tabellensperren nicht funktionieren, was mir mit einer clustered mariaDB passiert ist.

+6

Verwenden Sie stattdessen 'flyway.baseline-on-migrate = true' . 'flyway.initOnMigrate' ist veraltet. –

+0

Danke, ich habe die Antwort aktualisiert! –

+2

Diese Antwort sollte in der Tat als die akzeptierte Antwort markiert werden – mainframer