web-dev-qa-db-ja.com

FlywayとSpring Bootの統合

HibernateとSpring JPAを使用して、Spring Bootプロジェクトの移行用にFlywayを統合しようとしています。次の例外が発生しています。

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.

僕の pom.xmlは次のようになります。

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

私はHibernateとconfig Javaファイルを使用しています。署名は次のようになっています。

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

この質問で説明されている問題については何も見つかりません。誰でも助けることができますか?

23
imalik8088

これを行うには、Spring-Bootが単独で使用できます。プロジェクトへの依存関係としてflywayを追加するだけで、spring-bootがそれを取得します。サービスの開始時にフライウェイの移行が開始されます。

データベースにすでにいくつかのテーブルがある場合は、次を追加します。

flyway.baseline-on-migrate=true

プロパティファイルで、いくつかのテーブルが既に存在することを発見したときにフライウェイを落ち着かせます。 ;-)

Flywayがデータソースを取得します。たとえば、別のユーザー、またはflywayのようなユーザーが必要な場合は、次のプロパティを設定できます。

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

(もちろん、値を追加してください!SPELを使用して他のプロパティを参照できます)

更新

注意事項:クラスター化されたデータベースを使用する場合、同時に開始された複数のインスタンスが同時に更新を実行しようとするという問題が発生する可能性があります。これは、テーブルロックが機能しない場合の問題であり、クラスター化されたmariaDBを使用している場合に発生しました。

48

Javaコードで解決したい人のために使用できます:

fly.setBaselineOnMigrate(true);
3
YCF_L