programing

플라이웨이와 스프링 부트 통합

newstyles 2023. 2. 23. 22:09

플라이웨이와 스프링 부트 통합

Spring Boot 프로젝트에 Flyway를 Hibernate 및 Spring JPA와 통합하려고 합니다.다음과 같은 예외가 발생합니다.

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>

postgres(dev stage) 및 h2(local)용으로 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() {
...

나는 이 질문에 나와 있는 나의 문제에 대해 아무것도 찾을 수 없다.누구 도와줄 사람?

Spring-Boot은 스스로 이 작업을 수행할 수 있습니다.프로젝트에 의존적인 플라이웨이를 추가하는 것만으로, 스프링 부트가 그것을 픽업합니다.서비스가 시작되면 플라이웨이 마이그레이션이 시작됩니다.

데이터베이스에 이미 몇 개의 테이블이 있는 경우 다음을 추가합니다.

spring.flyway.baselineOnMigrate = true 

일부 테이블이 이미 존재하는 것을 발견했을 때 플라이웨이를 조용하게 유지하도록 속성 파일에 입력합니다. ;-)

플라이웨이가 데이터 소스를 픽업합니다.예를 들어 플라이웨이에 다른 사용자 등이 필요한 경우 다음 속성을 설정할 수 있습니다.

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

(당연히 가치를 더하세요!SPEL을 사용하여 다른 속성을 참조할 수 있습니다.)

갱신하다

한 가지 주의사항:클러스터된 데이터베이스를 사용하는 경우 동시에 시작된 여러 인스턴스가 동시에 업데이트를 수행하려고 하는 문제가 발생할 수 있습니다.이는 테이블 잠금이 작동하지 않을 때 발생하는 문제이며, 이는 클러스터화된 mariaDB를 사용하여 발생한 것입니다.

Java 코드로 문제를 해결하려면 다음 명령을 사용합니다.

fly.setBaselineOnMigrate(true);

편집(22-09-2020)

또 다른 해결책도 다음과 같습니다.

spring:
  flyway:
    baselineOnMigrate: true
    validateOnMigrate: false

언급URL : https://stackoverflow.com/questions/29257440/flyway-and-spring-boot-integration