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

xar*_*rqt 11 database sql-server spring flyway spring-boot

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

我在pom中添加了flyway核心:

 <dependency>
        <groupId>org.flywaydb</groupId>
        <artifactId>flyway-core</artifactId>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

创建了配置文件:

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();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

我创建了一个文件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
Run Code Online (Sandbox Code Playgroud)

我不知道如何解决这个问题,我寻找解决方案但无法解决。有人能帮助我吗?

ame*_*een 24

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

spring.jpa.defer-datasource-initialization =true #set it to false
Run Code Online (Sandbox Code Playgroud)

在您的应用程序中。[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 , defer 模式下的 Datasource 会等待 EntityManagerFactory 和 Ofc 因为我们使用 Flyway 默认是在 Jpa 之前启动 Flyway 以保证 DB 一致性

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