带有 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?如果是的话怎么办?