在 flyway 迁移脚本之前执行 JPA table 创建
Execute JPA table creation before flyway migration script
我想使用此 Spring 属性文件进行数据库配置。
spring.jmx.enabled=false
spring.datasource.jndi-name=java:/global/production
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MariaDBDialect
spring.jpa.show-sql = true
spring.jpa.hibernate.ddl-auto = update
request.limit=300000
spring.flyway.baselineOnMigrate = true
spring.flyway.locations=classpath:/db/migration
代码运行良好,但不幸的是,当删除所有表后数据库为空时,我得到 SQL 错误,因为首先执行了迁移脚本。
如何先配置 JPA 来创建表,然后配置 flyway 来执行迁移脚本?
在休眠执行之前迁移运行。您可以通过查看引导顺序来做到这一点。为此,您需要添加此配置 class:
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);
}
}
查看this答案你会得到详细信息。
为了避免循环依赖这样写:
@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();
}
}
灵感来自this答案
我想使用此 Spring 属性文件进行数据库配置。
spring.jmx.enabled=false
spring.datasource.jndi-name=java:/global/production
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MariaDBDialect
spring.jpa.show-sql = true
spring.jpa.hibernate.ddl-auto = update
request.limit=300000
spring.flyway.baselineOnMigrate = true
spring.flyway.locations=classpath:/db/migration
代码运行良好,但不幸的是,当删除所有表后数据库为空时,我得到 SQL 错误,因为首先执行了迁移脚本。
如何先配置 JPA 来创建表,然后配置 flyway 来执行迁移脚本?
在休眠执行之前迁移运行。您可以通过查看引导顺序来做到这一点。为此,您需要添加此配置 class:
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);
}
}
查看this答案你会得到详细信息。
为了避免循环依赖这样写:
@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();
}
}
灵感来自this答案