飞行通道和弹簧靴集成

2022-09-01 08:20:00

我试图将Flyway与Hibernate和Spring JPA集成在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.

我的看起来像这样:pom.xml

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

我正在使用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() {
...

我找不到有关此问题中描述的问题的任何信息。任何人都可以帮忙吗?


答案 1

Spring-Boot本身有能力做到这一点。只需将flyway作为依赖项添加到您的项目中,Spring-boot就会将其拾起。Flyway 迁移将在服务启动时开始。

如果数据库中已有一些表,请添加:

spring.flyway.baselineOnMigrate = true 

在您的属性文件中,以便在发现某些表已存在时保持飞行方式平静。;-)

Flyway应该拿起你的数据源。例如,如果您需要其他用户或类似的东西来设置flyway,则可以设置以下属性:

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

(当然要加上你的价值观!可以使用 SPEL 引用其他属性)

更新

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


答案 2

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

fly.setBaselineOnMigrate(true);

编辑(22-09-2020)

另一个解决方案也是:

spring:
  flyway:
    baselineOnMigrate: true
    validateOnMigrate: false

推荐