项目中使用了JPA自动生成表结构,又使用了Flyway 数据库版本控制,spring boot项目启动时,表结构还未创建好,就先执行了Flyway更新或插入初始数据导致启动失败。
所以要解决此问题,就要修改他们的启动顺序,让JPA初始DB结构后再去执行Flyway。
系统的配置:
jpa:
hibernate:
ddl-auto: update
properties:
hibernate:
dialect: org.hibernate.dialect.PostgreSQLDialect
temp:
use_jdbc_metadata_defaults: false
format_sql: true
flyway:
# 是否启用flyway. 等[locations]已经创建并包含文件后, 这一条改为true.
enabled: false
## 编码格式,默认UTF-8
encoding: UTF-8
## 迁移sql脚本文件存放路径,默认db/migration
locations: classpath:db/migration
## 迁移sql脚本文件名称的前缀,默认V
sqlMigrationPrefix: V
## 迁移sql脚本文件名称的分隔符,默认2个下划线__
sqlMigrationSeparator: __
# 迁移sql脚本文件名称的后缀
sqlMigrationSuffixes: .sql
# 迁移时是否进行校验,默认true
validateOnMigrate: true
# 设置为true,当迁移发现数据库非空且存在没有元数据的表时,自动执行基准迁移,新建schema_version表
baselineOnMigrate: true
# 設置佔位符
placeholderReplacement: false
# postgres10没有引入这个不提示错误,postgres12没有引入会报错
schemas: public
解决方案:增加一个FlywayConfig.java
import org.flywaydb.core.Flyway;
import org.springframework.boot.autoconfigure.flyway.FlywayMigrationInitializer;
import org.springframework.boot.autoconfigure.flyway.FlywayProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
/**
* Flyway 延遲執行
* 避免空數據庫執行失敗
*
* @author dqian
*/
@Configuration
public class FlywayConfig {
@Bean
FlywayMigrationInitializer flywayInitializer(Flyway flyway) {
return new FlywayMigrationInitializer(flyway, (f) -> {
});
}
static class Dummy {
}
@Bean
@DependsOn("entityManagerFactory")
Dummy delayedFlywayInitializer(Flyway flyway, FlywayProperties flywayProperties) {
if (flywayProperties.isEnabled())
flyway.migrate();
return new Dummy();
}
}