스프링 부트:휴지 상태 및 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
'programing' 카테고리의 다른 글
리액트에서 이진 데이터를 이미지로 표시하는 방법은 무엇입니까? (0) | 2023.03.04 |
---|---|
Json Convert.사용되지 않는 날짜 형식을 사용하는 경우 DeserializeObject에서 문자열을 DateTime으로 변환할 수 없습니다. (0) | 2023.03.04 |
구문 오류:Object.parse(네이티브) Angular에 예기치 않은 토큰이 있습니다.JS (0) | 2023.03.04 |
Mongo에서 "NOT IN" 쿼리를 실행하려면 어떻게 해야 하나요? (0) | 2023.03.04 |
예: keycloak spring-boot 어플리케이션이 bean Keycloak Spring BootConfigResolver를 찾을 수 없음 (0) | 2023.03.04 |