我想将这个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 以创建表,然后再执行迁移脚本?
要避免循环依赖,请这样写:
@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();
}
}
受到这个答案的启发
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);
}
}
看看这个答案,你会得到详细信息。
在使用可重复迁移时,我观察到一些奇怪的飞行路线行为。文件指出: 在一次迁移运行中,可重复迁移始终在所有挂起的版本化迁移执行完毕后最后应用。 但在我的例子中,可重复迁移(正在重新创建一个DB视图)似乎失败了,因为它是在版本化迁移之前执行的。 迁移前的Flyway信息数据:
我正在使用flyway数据库迁移工具和一个spring boot jpa项目。当我第一次运行服务器时,flyway希望迁移SQL,但表还没有创建。在这种情况下,flyway返回一个错误,该错误类似 spring.flyway.baseline-on-migrate=true spring.flyway.enabled=true spring.flyway.clean-on-validation-e
在我的spring-boot项目中,我使用了Flyway的开箱即用集成(),并且有一些迁移脚本,它们在启动时执行,并通过默认的-table进行管理。 该项目还使用了一个自带flyway迁移脚本的模块,这些脚本是以编程方式迁移的,并在其他表中跟踪迁移情况。 由于主项目的迁移需要对通过模块迁移创建的一些表进行操作,因此模块迁移需要在flyway-plugin迁移主项目脚本之前进行。 如何在主要应用的F
我在一株嵌入的野花上做了阿奎利亚测试。尽管所有移植脚本、集成器类(flyway在其中安装)和所有FlyWay包(来自POM文件)都包含在。war文件(部署在嵌入式wildfly上),不进行迁移。 这有什么原因吗?这是原则上不起作用还是我错过了什么? 我喜欢实现的是,arquillian运行的自动测试将设置一个内存数据库,其方案与使用相同迁移脚本的生产数据库相同。 编辑:正如ytg下面所问的,我添加
Flyway在其留档中说明了可重复迁移的一些用法: 用法:(重新)创建视图/过程/函数/包/... 我想在可重复迁移中创建一些触发器/函数,这些稍后会在版本迁移中引用,并应用到表中。 Flyway最后运行可重复的迁移,这意味着触发器在被引用时不存在。 是否可以在版本化迁移之前运行某些可重复的迁移? 是否不支持此用例,因为自动更新应用于表的触发器是不好的做法?
我们希望使用Flyway进行数据库迁移。除了迁移脚本之外,我们还需要执行一些不应被视为迁移的脚本(并且不需要在schema_version表中跟踪)。例如,执行包含配置数据或仅与开发环境相关的测试数据的脚本。我们仍然希望使用flyway-maven-plugin来执行这些SQL脚本,而不是在我的flyway-maven-plugin之前/之后运行的不同maven插件。 对于flyway的迁移前和迁