programing

스프링 부트:휴지 상태 및 Flyway 부팅 순서

cafebook 2023. 3. 4. 15:10
반응형

스프링 부트:휴지 상태 및 Flyway 부팅 순서

Spring 어플리케이션을 만들었습니다.Pom xml이 첨부되었습니다.

다음과 같은 구성(아래)과 Flyway DB 마이그레이션 도구용 db/migration/V1_init.sql이 있습니다.

hsqldb 인메모리 데이터베이스가 있으며 응용 프로그램 실행 후 생성됩니다.생성 후 깨끗합니다.

Hibernate에서 엔티티 클래스를 기반으로 스키마를 만들고 Flyway가 테이블을 채웁니다.이제 Flyway는 테이블이 생성되고 예외가 발생하기 전에 V1__init.sql을 시작합니다.이 주문의 변경 방법 또는 어떤 솔루션을 사용할 수 있습니까?

spring.datasource.testWhileIdle = true
spring.datasource.validationQuery = SELECT 1
spring.jpa.show-sql = true
spring.jpa.hibernate.ddl-auto = create-drop
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.HSQLDialect

pom.xml:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.3.RELEASE</version>
    <relativePath/>
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>1.3.2.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.hsqldb</groupId>
        <artifactId>hsqldb</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>4.3.11.Final</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>4.2.5.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.thymeleaf</groupId>
        <artifactId>thymeleaf-spring4</artifactId>
        <version>2.1.4.RELEASE</version>
    </dependency>

    <!-- For using 'LEGACYHTML5' mode in Thymeleaf -->
    <dependency>
        <groupId>net.sourceforge.nekohtml</groupId>
        <artifactId>nekohtml</artifactId>
        <version>1.9.21</version>
    </dependency>
    <dependency>
        <groupId>xml-apis</groupId>
        <artifactId>xml-apis</artifactId>
        <version>1.4.01</version>
    </dependency>

    <dependency>
        <groupId>org.flywaydb</groupId>
        <artifactId>flyway-core</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
        <version>1.3.3.RELEASE</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

저도 같은 문제가 있었어요.

데이터베이스에 의존하지 않기 때문에 최대 절전 모드로 스키마를 만들고 싶었습니다.저는 이미 jpa 수업에서 신청에 적합한 스키마를 찾는 데 어려움을 겪었기 때문에 반복하는 것을 좋아하지 않습니다.

하지만 데이터 초기화는 플라이웨이가 잘 되는 버전화된 방식으로 수행했으면 합니다.

스프링 부트는 하이버네이션 전에 플라이웨이 이행을 실행합니다.변경하기 위해 스프링 부트 이니셜라이저를 오버로드하여 아무것도 하지 않도록 했습니다.그 후 휴지 상태가 완료된 후 실행되는 두 번째 이니셜라이저를 만들었습니다.필요한 것은 다음 컨피규레이션클래스를 추가하는 것뿐입니다.

import org.flywaydb.core.Flyway;
import org.springframework.boot.autoconfigure.flyway.FlywayMigrationInitializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;

@Configuration
public class MigrationConfiguration {


    /**
     * Override default flyway initializer to do nothing
     */
    @Bean
    FlywayMigrationInitializer flywayInitializer(Flyway flyway) {
        return new FlywayMigrationInitializer(flyway, (f) ->{} );
    }


    /**
     * Create a second flyway initializer to run after jpa has created the schema
     */
    @Bean
    @DependsOn("entityManagerFactory")
    FlywayMigrationInitializer delayedFlywayInitializer(Flyway flyway) {
        return new FlywayMigrationInitializer(flyway, null);
    }


}

이 코드에는 Java 8이 필요합니다.Java 7 이전 버전을 사용하는 경우 대체하십시오.(f)->{}Flyway Migration Strategy를 구현하는 내부 클래스 포함

물론 xml에서도 쉽게 실행할 수 있습니다.

반드시 다음 내용을 application.properties에 추가하십시오.

flyway.baselineOnMigrate = true

Hibernate가 모든 테이블을 생성한 후 모든 SQL 마이그레이션이 시작됩니다.

스프링 부트 2.2.2, 플라이웨이 6.0.8

Flyway 부팅을 비활성화하려면 resources/application.properties에 삽입합니다.

spring.flyway.enabled=false

최대 절전 모드가 준비되었을 때 Flyway를 로드하도록 별도의 구성을 만듭니다.

@Configuration
public class FlywayConfiguration {

    @Autowired
    public FlywayConfiguration(DataSource dataSource) {
        Flyway.configure().baselineOnMigrate(true).dataSource(dataSource).load().migrate();
    }
}

버전 2에서 마이그레이션 스크립트를 시작합니다.

resources/db.migration/V2__fill-tables.sql

V1이 기준으로 사용되며 V1 파일은 무시됩니다.

Flyway의 Spring Boot 자동설정에 의해 하이버네이트가 초기화되기 전에 데이터베이스 이행이 확실하게 실행됩니다.즉, Flyway 자동 구성에 의존할 수 없으며 Flyway를 사용하여 Hinernate가 작성한 테이블을 채울 수 없습니다.

한 가지 해결책은 Flyway를 완전히 수용하여 테이블을 만들고 입력하는 것입니다.다음으로 휴지 상태의 테이블 작성을 끌 수 있습니다(spring.jpa.hibernate.ddl-auto=none은 데이터베이스를 수이 접근방식은 데이터베이스를 보다 쉽게 진화시킬 수 있기 때문에 더욱 견고합니다.이치노

다른 Flyway)의 자동 을 비활성화하는 입니다.flyway.enabled=false직접 설정할 수 있습니다.그런 다음 Flyway가 테이블을 채우기 전에 Hibernate가 테이블을 생성하도록 Flyway를 Hibernate에 의존하도록 구성할 수 있습니다.

Spring Boot + 2.1을 사용하고 있으며 @mota가 @user3707816의 답변에 코멘트한 최신 사용자에게는 spring을 사용할 수 있습니다.application.properties에 flyway.enabled=false를 입력한 후 수동으로 새 인스턴스를 만듭니다.

Flyway.configure().dataSource(dataSource)
                .baselineOnMigrate(true)
                .schemas(PG_DATABASE_SCHEMA)//optional, by default is public
                .load().migrate();

이것은 Spring Boot 2.3.1에서 사용할 수 있습니다.

1- resources/application.properties에 삽입하여 Flyway 부팅을 비활성화해야 합니다.

spring.flyway.enabled = false

2- 버전 2에서 마이그레이션 스크립트를 시작합니다. V1이 기준으로 사용되므로 V1 파일은 무시됩니다.

3- @SpringBootApplication 클래스에서 CommandLineRunner 인터페이스를 구현합니다(SpringBoot Application이 시작된 후 코드 실행에 사용됩니다).이 클래스는 다음과 같습니다.

@SpringBootApplication
public class SpringBootApplication implements CommandLineRunner {

    @Autowired
    DataSource dataSource;

    public static void main(String[] args) {
        SpringApplication.run(SpringBootApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        Flyway.configure().baselineOnMigrate(true).dataSource(dataSource).load().migrate();
    }

}

이 답변은 나에게 도움이 되었다.

Spring Boot 2.1.8 이후에서도 Flyway를 빈으로 설정하고 싶지만 순환 의존관계 오류에 빠진 사용자에게는@DependsOn("flyway")된 「」, 「」, 「」,EntityManagerFactory을 사용하다

저, 정을 설정합니다.spring.flyway.enabled로로 합니다.false '를 만들어서 '클래스'를 만들어요.BeanFactoryPostProcessor콩이 생기기 전에 플라이웨이 의존성을 배제할 수 있습니다.§:

@Component
public class FlywayDeferrerPostProcessor implements BeanFactoryPostProcessor {

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        excludeDependsOnFlywayFromBean(beanFactory, DataSourceScriptDatabaseInitializer.class);
        excludeDependsOnFlywayFromBean(beanFactory, EntityManagerFactory.class);
    }

    private void excludeDependsOnFlywayFromBean(ConfigurableListableBeanFactory beanFactory, Class<?> beanClass) {
        Stream.of(beanFactory.getBeanNamesForType(beanClass))
            .map(beanFactory::getBeanDefinition)
            .filter(it -> it.getDependsOn() != null && it.getDependsOn().length > 0)
            .forEach(it -> it.setDependsOn(Stream.of(it.getDependsOn()).filter(name -> !name.equals("flyway")).toArray(String[]::new)));
    }
}

이 예는 극히 미미하며 새로운 버전에서 중단될 수 있습니다.를 들어, 제 에서는, 을, 의 방법인 「마음대로」 「마음대로」 「마음대로」 「마음대로」 「마음대로」 「마음대로」 「마음대로」 「마음대로」 「마음대로」 「마음대로」 「마음대로」를 .recursivelyExcludeDependencyOnFromBeanDefinition(EntityManagerFactory.class, Flyway.class)가 '알겠습니다'에서 찾을 수 EntityManagerFactory 플라이웨이에 다르므로 를 알DataSourceScriptDatabaseInitializer플라이웨이

이 모든 것을 작동시키려면 bean 정의를 정상적으로 추가합니다.

@Bean(initMethod = "migrate")
@DependsOn("entityManagerFactory")
public Flyway flyway() { /* ... */ }

당신이Flyway수, 인 으으면면 being 、 면면 、 는면 、 는 being 、 a being 、 a a a a 。@Configuration@syslety의 답변과 같은 파일입니다.

순서 때문일 수도 있다

add on application.properties

flyway.out-of-order = true

또는 application.yml(스프링의 경우)

flyway:
  out-of-order: true

언급URL : https://stackoverflow.com/questions/37097876/spring-boot-hibernate-and-flyway-boot-order

반응형