Spring Boot:Hibernate和Flyway启动顺序

我创建了Spring应用程序。 附加了Pom xml。

它具有这样的配置(如下)和一些用于Flyway数据库迁移工具的db / migration / V1__init.sql。

它有hsqldb内存数据库,它是在应用程序启动后创建的。 创作后很干净。

我希望Hibernate基于实体类创建一个模式,然后Flyway填充表格。 现在,Flyway在创建表之前启动V1__init.sql并抛出exception。 如何更改此订单或我可以执行哪些解决方案?

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中:

  org.springframework.boot spring-boot-starter-parent 1.3.3.RELEASE    UTF-8 1.8    org.springframework.boot spring-boot-starter-web 1.3.2.RELEASE   org.hsqldb hsqldb runtime   org.hibernate hibernate-core 4.3.11.Final   org.springframework spring-orm 4.2.5.RELEASE   org.thymeleaf thymeleaf-spring4 2.1.4.RELEASE    net.sourceforge.nekohtml nekohtml 1.9.21   xml-apis xml-apis 1.4.01   org.flywaydb flyway-core   org.springframework.boot spring-boot-starter-data-jpa 1.3.3.RELEASE      org.springframework.boot spring-boot-maven-plugin    

我遇到过同样的问题。

我希望我的架构由hibernate创建,因为它具有数据库独立性。 我已经经历了在我的jpa课程中为我的应用程序找出一个很好的模式的麻烦,我不喜欢重复自己。

但我希望一些数据初始化能够以飞路擅长的版本化方式完成。

Spring引导在hibernate之前运行flyway迁移。 为了改变它,我覆盖了弹簧启动初始化器,什么都不做。 然后我创建了第二个初始化程序,它在hibernate完成后运行。 您需要做的就是添加此配置类:

 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或更早版本,用实现FlywayMigrationStrategy的内部类替换(f)->{}

当然,您可以在xml中轻松完成此操作。

确保将其添加到您的application.properties:

 flyway.baselineOnMigrate = true 

Flyway的Spring Boot自动配置可确保在初始化Hibernate之前运行数据库迁移。 换句话说,您不能依赖Flyway自动配置并使用Flyway来填充由Hinernate创建的表。

一种解决方案是完全接受Flyway并使用它来创建表并填充它们。 然后,您可以关闭Hibernate的表创建( spring.jpa.hibernate.ddl-auto=none )。 这种方法更加健壮,因为它可以让您的数据库更容易发展。 这就是我建议您这样做的。

另一个解决方案是禁用flyway.enabled=false自动配置( flyway.enabled=false )并将其配置为自己。 然后,您可以将Flyway配置为依赖于Hibernate,以便在Flyway尝试填充它们之前Hibernate已创建表。

我已经解决了我的任务。 我删除了Flyway,只是添加了data.sql