【问题标题】:Spring Boot deferred Flyway inizialization circular dependencySpring Boot 延迟 Flyway 初始化循环依赖
【发布时间】:2020-02-18 08:05:53
【问题描述】:

我需要在 Hibernate 生成所有 schema 表后执行 Flyway 迁移。 在迁移到 Spring Boot 2.2 之前,这段代码运行良好

@Configuration
public class BaseFlywayConfiguration {

    /**
     * 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("transactionManager")
    FlywayMigrationInitializer delayedFlywayInitializer(Flyway flyway) {
        return new FlywayMigrationInitializer(flyway, null);
    }

}

不幸的是,在迁移到 Spring Boot 2.2.0 后,我收到一个与循环依赖相关的异常

这是日志:

应用上下文中一些bean的依赖形成一个循环:

┌─────┐ |在类路径资源 [com/myFleetSolutions/myFleet/organization/configuration/jpa/JPAConfigurationDev.class] 中定义的 transactionManager └──────┘

我该如何解决?

【问题讨论】:

标签: java spring spring-boot


【解决方案1】:

理想情况下,您应该在 flyway 中创建所有架构(表、序列等),而不是使用 Hibernate 来生成它。我建议导出您当前的模式,然后创建一个 V1__init-schema.sql 以用于初始化。然后将hibernate.hbm2ddl.auto 设置为验证或无。

【讨论】:

  • 这是一种方式,无论如何我更喜欢让hibernate创建模式以避免每次发生变化时都导出它
  • 最终,随着您的应用程序的增长和变得越来越复杂,将会出现 hibernate 无法处理的场景。例如。更改数据库列名。我们发现,对于需要更高稳定性的大型项目,最好将所有 DDL 都放在像 Flyway 这样的模式迁移器中。但是如果你想要的话,休眠方式可以为你工作。
【解决方案2】:

我只是在@SpringBootApplication 类中注入了Flyway bean,并在CommandLineRunner init 方法中执行了flyway.migrate()。 它在系统启动结束时执行并且工作正常

谢谢

安东尼奥

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 2020-07-15
    • 2016-02-18
    • 1970-01-01
    • 2020-05-10
    相关资源
    最近更新 更多