当前位置: 首页 > 知识库问答 >
问题:

在flyway迁移脚本之前执行JPA表创建

陶福
2023-03-14

我想将这个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 以创建表,然后再执行迁移脚本?

共有2个答案

养俊驰
2023-03-14

要避免循环依赖,请这样写:

@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();
    }
}

受到这个答案的启发

闻人举
2023-03-14

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的迁移前和迁