2015-03-25 4 views
11

Sto cercando di integrare Flyway per le migrazioni in un progetto Spring Boot con Hibernate e Spring JPA. Sto ottenendo la seguente eccezione:Integrazione Flyway e 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. 

mio pom.xml sta cercando in questo modo:

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

Sto usando Hibernate e un file di configurazione java per Postgres (stadio dev) e H2 (Locale). Le firme sono simili al seguente:

@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() { 
... 

Non riesco a trovare nulla sul mio problema descritto in questa domanda. Qualcuno può aiutare?

+2

Spring Boot supporta già flyway l'unica cosa di cui hai bisogno è aggiungere flyway come dipendenza ... Suggerisco una lettura del [manuale] (http://docs.spring.io/spring-boot/docs/current/ reference/html/howto-database-initialization.html # howto-execute-flyway-database-migrations-on-startup) e per [proprietà di configurazione] (http://docs.spring.io/spring-boot/docs//riferimento/html/common-application-properties.html corrente). Per me sembra che tu stia usando il boot e ci sforzi molto per aggirarlo (configurando esplicitamente tutto per esempio). –

+0

piuttosto strano: l'avvio a molla non dovrebbe avviare l'autoconfigurazione flyway se si configura da solo il flyway (la domanda è se è necessario). tuttavia, l'errore deriva dalla configurazione automatica di avvio. comunque prova ad aggiungere 'flyway.initOnMigrate = true' alle tue applicazioni.proprietà e rimuovi la tua inizializzazione flyway :) – sodik

+0

thx per i colpi. – imalik8088

risposta

36

Spring-Boot è in grado di farlo. Basta aggiungere flyway come dipendenza al progetto e spring-boot lo raccoglierà. La migrazione di Flyway verrà avviata all'avvio del servizio.

Se si dispone già di alcune tabelle del database aggiuntivo:

flyway.baseline-on-migrate=true 

nel file di proprietà per mantenere flyway calma quando si scopre che esistono già alcune tabelle. ;-)

Flyway dovrebbe raccogliere l'origine dati. Se avete bisogno per esempio un altro utente o qualcosa di simile per flyway, è possibile impostare queste proprietà:

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

(! Naturalmente aggiungere i valori È possibile utilizzare SPEL fare riferimento altre proprietà)

Aggiornamento

Una parola di cautela: se si utilizza un database in cluster, è possibile che si verifichino problemi nel caso in cui più istanze avviate contemporaneamente provino a eseguire gli aggiornamenti nello stesso momento. Questo è un problema quando i blocchi della tabella non funzionano, cosa che mi è successo usando un mariaDB in cluster.

+6

Usa 'flyway.baseline-on-migrate = true' invece. 'flyway.initOnMigrate' è deprecato. –

+0

Grazie, ho aggiornato la risposta! –

+2

questa risposta dovrebbe essere contrassegnata come risposta accettata – mainframer