web-dev-qa-db-fra.com

Intégration Flyway et Spring Boot

J'essaie d'intégrer Flyway pour les migrations dans un projet Spring Boot avec Hibernate et Spring JPA. J'obtiens l'exception suivante:

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.

Ma pom.xml ressemble à ceci:

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

J'utilise Hibernate et un fichier de configuration Java pour postgres (stade de développement) et h2 (local). Les signatures ressemblent à ceci:

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

Je ne trouve rien sur mon problème décrit dans cette question. Quelqu'un peut-il aider?

23
imalik8088

Spring-Boot est capable à lui seul de le faire. Ajoutez simplement flyway comme dépendance à votre projet et spring-boot le reprendra. La migration des voies de migration commencera au démarrage du service.

Si vous avez déjà des tables dans la base de données, ajoutez:

flyway.baseline-on-migrate=true

dans votre fichier de propriété pour garder la voie de migration calme lorsqu'il découvre que certaines tables existent déjà. ;-)

Flyway devrait récupérer votre source de données. Si vous avez besoin par exemple d'un autre utilisateur ou de quelque chose comme ça pour flyway, vous pouvez définir ces propriétés:

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

(Bien sûr, ajoutez vos valeurs! Vous pouvez utiliser SPEL pour référencer d'autres propriétés)

Mise à jour

Un mot d'avertissement: si vous utilisez une base de données en cluster, vous pouvez rencontrer des problèmes lorsque plusieurs instances démarrées en même temps tentent d'effectuer les mises à jour en même temps. C'est un problème lorsque les verrous de table ne fonctionnent pas, ce qui m'est arrivé en utilisant un mariaDB en cluster.

48
Patrick Cornelissen

Pour tous ceux qui veulent le résoudre en Java code, vous pouvez utiliser:

fly.setBaselineOnMigrate(true);
3
YCF_L