Flyway和Spring Boot集成

ima*_*088 24 java spring hibernate flyway spring-boot

我试图在Spring Boot项目中使用Hibernate和Spring JPA集成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.
Run Code Online (Sandbox Code Playgroud)

pom.xml看起来像这样:

<dependency>
  <groupId>org.flywaydb</groupId>
  <artifactId>flyway-core</artifactId>
  <version>3.2</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

我正在使用Hibernate和一个用于postgres(开发阶段)和h2(本地)的配置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() {
...
Run Code Online (Sandbox Code Playgroud)

我找不到关于我在这个问题中描述的问题的任何内容.有人可以帮忙吗?

Pat*_*sen 48

Spring-Boot能够独立完成这项工作.只需将flyway添加为项目的依赖项,spring-boot就会将其解除.飞行迁移将在服务启动时启动.

如果您已经在数据库中添加了一些表:

flyway.baseline-on-migrate=true
Run Code Online (Sandbox Code Playgroud)

在你的属性文件中,当发现一些表已经存在时,保持飞路平静.;-)

Flyway应该拿起您的数据源.如果您需要另一个用户或类似飞路的用户,您可以设置以下属性:

flyway.url: jdbc:postgresql://${db.host}/${db.name}
flyway.user: MYUSER
flyway.password: MYPWD
Run Code Online (Sandbox Code Playgroud)

(当然添加您的值!您可以使用SPEL引用其他属性)

更新

需要注意的一点是:如果使用群集数据库,则可能会遇到同时启动的多个实例同时尝试执行更新的问题.当表锁不起作用时,这是一个问题,这发生在使用集群mariaDB的情况下.

  • 请改用"flyway.baseline-on-migrate = true".`flyway.initOnMigrate`已弃用. (11认同)
  • 这个答案确实应该被标记为已接受的答案 (3认同)

YCF*_*F_L 7

对于任何想要在 Java 代码中解决它的人,您可以使用:

fly.setBaselineOnMigrate(true);
Run Code Online (Sandbox Code Playgroud)

编辑(22-09-2020)

另一个解决方案也是:

spring:
  flyway:
    baselineOnMigrate: true
    validateOnMigrate: false
Run Code Online (Sandbox Code Playgroud)