带有 Spring Boot 的 Flyway Core 给出错误 'delayedFlywayInitializer' 和 'entityManagerFactory' 之间的循环依赖关系

Posted

技术标签:

【中文标题】带有 Spring Boot 的 Flyway Core 给出错误 \'delayedFlywayInitializer\' 和 \'entityManagerFactory\' 之间的循环依赖关系【英文标题】:Flyway Core with Spring Boot gives error Circular depends-on relationship between 'delayedFlywayInitializer' and 'entityManagerFactory'带有 Spring Boot 的 Flyway Core 给出错误 'delayedFlywayInitializer' 和 'entityManagerFactory' 之间的循环依赖关系 【发布时间】:2021-03-07 10:47:56 【问题描述】:

我想在 SQL server 数据库上导入一些数据,我使用的是 Spring Boot 2.3.4。我也使用 Hibernate 来生成表格。

我在 pom 中添加了 flyway 核心:

 <dependency>
        <groupId>org.flywaydb</groupId>
        <artifactId>flyway-core</artifactId>
    </dependency>

创建了配置文件:

import org.flywaydb.core.Flyway;
import org.springframework.boot.autoconfigure.flyway.FlywayMigrationInitializer;
import org.springframework.boot.autoconfigure.flyway.FlywayMigrationStrategy;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;

@Configuration
public class FlyWayConfiguration 

    @Bean
    FlywayMigrationInitializer flywayInitializer(Flyway flyway) 
        return new FlywayMigrationInitializer(flyway, (f) -> );
    
    
    @Bean
    @DependsOn("entityManagerFactory")
    FlywayMigrationInitializer delayedFlywayInitializer(Flyway flyway) 
        return new FlywayMigrationInitializer(flyway, new FlywayMigrationStrategy() 
            @Override
            public void migrate(Flyway flyway) 
            
                flyway.migrate();
            
        );
    

我在resources/db/migration/V1_0_1__InitialData.sql上创建了一个文件

现在我遇到了这个错误

    Error creating bean with name 'delayedFlywayInitializer' defined in class path resource
    [com/ikun/mkj/config/MigrationConfiguration.class]: Circular depends-on relationship between
    'delayedFlywayInitializer' and 'entityManagerFactory' at 
org.springframework.beans.factory.support.AbstractBeanFactory

我不知道如何解决这个问题,我搜索了解决方案但无法解决。 有人可以帮帮我吗?

【问题讨论】:

嗨,你需要这个@DependsOn("entityManagerFactory")吗?如果您删除该问题可能会解决 如果我删除它,flyway在hibernate创建表之前初始化,因此脚本迁移失败导致表尚未创建,所以这是问题吗? @MarcosBarbero 我明白了,但是你不需要 Hibernate 来创建你的模式,你可以使用 Flyway 来做到这一点。将两者混合只会让您更加困难 我需要使用 Hibernate 来创建表格和其他一切。关于flyway,我还能用什么来迁移数据? 虽然 Hibernate 支持该操作,但您不需要使用它来执行此操作。 Flyway 不仅用于数据迁移,它还是一个工具,使您能够对数据库进行版本控制,您可以使用 Flyway 创建与数据库相关的任何您需要的表、模式。 【参考方案1】:

您很可能通过添加来推迟数据源初始化:

spring.jpa.defer-datasource-initialization =true #set it to false

在您的应用程序中。[yml/properties]。

删除它或设置为 false 可以解决您的问题

如参考: https://docs.spring.io/spring-boot/docs/current/reference/html/howto.html

将 spring.jpa.defer-datasource-initialization 设置为 true。这会 将数据源初始化推迟到任何 EntityManagerFactory 之后 bean 已创建并初始化。然后可以使用 schema.sql 对 Hibernate 执行的任何模式创建进行添加和 data.sql 可用于填充它。

并且默认情况下 Flyway 依赖于 Datasource ,延迟模式下的 Datasource 会等待 EntityManagerFactory 而Ofc因为我们使用flyway所以默认是在Jpa之前启动Flyway来保证DB的一致性

所以我们有一个循环依赖flyway->DS->EMF->Flyway

【讨论】:

我仍然有这个问题,但这并没有解决它 如果你可以在github上设置你的代码示例 这确实为我解决了问题。使用 SpringBoot2.4.12

以上是关于带有 Spring Boot 的 Flyway Core 给出错误 'delayedFlywayInitializer' 和 'entityManagerFactory' 之间的循环依赖关系的主要内容,如果未能解决你的问题,请参考以下文章

带有PostgreSQL,Flyway和Hikari的Spring Boot 2:驱动程序声称不接受jdbcUrl

Spring Boot 应用程序在启动时未运行 Flyway 迁移

Spring boot Flyway Jooq Code gen maven 插件顺序

flyway with spring boot and gradle--org.flywaydb.core.Flyway: 方法 <init>()V not found

是否可以在 Spring Boot 应用程序中使用脚本创建数据库,并使用 flyway for postgres?如果是的话怎么办?

Spring-Boot 不适用于 Flyway