You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot 2.7.3升级至3.0.0后EntityManagerFactory创建失败求助

Spring Boot 3.0 迁移:EntityManagerFactory 无法工作的解决方案

问题概述

将Spring Boot从2.7.3升级到3.0.0后,应用启动失败,核心错误为:
org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider does not implement the requested interface jakarta.persistence.spi.PersistenceProvider
最终导致Spring无法找到entityManagerFactory Bean。


相关代码与配置

创建EntityManagerFactory的业务代码

@Override
public boolean isTenantSchemaExist(String tenantId) {
    EntityManagerFactory factory = 
        Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
    EntityManager manager = factory.createEntityManager();
    Query getSchemasQuery = manager.createNativeQuery(TENANT_SCHEMA_EXIST_QUERY);
    List<String> tenantSchemas = new ArrayList(getSchemasQuery.getResultList());
    return tenantSchemas.contains(tenantId);
}

build.gradle 依赖配置

dependencies {
    implementation "org.apache.logging.log4j:log4j-core:2.17.1"
    implementation "org.apache.logging.log4j:log4j-api:2.17.1"
    implementation "org.apache.logging.log4j:log4j-1.2-api:2.17.1"
    implementation 'org.apache.logging.log4j:log4j-to-slf4j:2.17.1'
    implementation "com.nexidia:nexidia-semanticanalysis:${semanticanalysisVersion}"
    implementation(group: 'com.nexidia', name: 'nexidia-workbench', version: '10.6.2.13')
    implementation ('org.springframework.boot:spring-boot-starter-web'){
        exclude group : 'org.yaml' , module : 'snakeyaml'
    }
    implementation 'org.springframework.retry:spring-retry'
    implementation ("org.springframework.boot:spring-boot-starter-data-jpa"){
        exclude group : 'org.yaml' , module : 'snakeyaml'
        exclude group: 'org.hibernate.orm', module: 'hibernate-core'
    }
       
    implementation "com.amazonaws:aws-java-sdk-dynamodb:${awsSDKVersion}"
    implementation ("com.amazonaws:aws-java-sdk-core:${awsSDKVersion}"){
        exclude group : 'org.yaml' , module : 'snakeyaml'
    }
    implementation "com.amazonaws:aws-java-sdk-ssm:${awsSDKVersion}"
    implementation "com.xyc.abc.cat:lib-feature-flags:${featureFlagsLibVersion}"
    implementation "com.google.guava:guava:${guavaVersion}"
    implementation "org.flywaydb:flyway-core:${flywayVersion}"
    implementation group: 'commons-io', name: 'commons-io', version: '2.7'
    //  For assuming role in local dev mode
    implementation "com.amazonaws:aws-java-sdk-sts:${awsSDKVersion}"
    implementation "org.postgresql:postgresql:${postgresJdbcVersion}"
    /*implementation ("org.hibernate:hibernate-c3p0:${hibernateVersion}"){
        exclude group : 'javax.persistence' , module : 'javax.persistence-api'
    }*/
    implementation "org.apache.httpcomponents.client5:httpclient5:${httpclient5}"
    implementation 'jakarta.persistence:jakarta.persistence-api'
    testImplementation "cloud.localstack:localstack-utils:${localStackUtilsVersion}"
    testImplementation "org.testcontainers:postgresql:${testPostgresVersion}"
    testImplementation "junit:junit:${junitVersion}"
    testImplementation 'jakarta.persistence:jakarta.persistence-api'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
        exclude group : 'org.yaml' , module : 'snakeyaml'
    }
}

gradle.properties 配置

semanticanalysisVersion=10.6.2.13
workbenchVersion=10.6.2.13
junitVersion=4.13.1
awsSDKVersion=1.11+
testPostgresVersion=1.15.0
jacocoVersion=0.8.7
localStackUtilsVersion=0.1.22
guavaVersion=31.1-jre
servicePort=80
version=22.1.0
serviceName=auto-discovery-model-generator
featureFlagsLibVersion=1.0.0-RELEASE
postgresJdbcVersion=42.4.1
hibernateVersion=5.4.26.Final
secretsManagerJdbcVersion=1.0.5
secretsManagerCacheVersion=1.0.1
flywayVersion=6.4.3
httpclient5=5.2
httpclient5Fluent=5.2

核心错误日志

2023-01-31T09:43:59.528Z  WARN 1626 --- [    Test worker] o.s.w.c.s.GenericWebApplicationContext   : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Class org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider does not implement the requested interface jakarta.persistence.spi.PersistenceProvider

连锁错误日志

2023-01-31T09:44:04.890Z  WARN 1626 --- [    Test worker] o.s.w.c.s.GenericWebApplicationContext   : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaSharedEM_entityManagerFactory': Cannot resolve reference to bean 'entityManagerFactory' while setting constructor argument

APPLICATION FAILED TO START

Description:
A component required a bean named 'entityManagerFactory' that could not be found.

Action:
Consider defining a bean named 'entityManagerFactory' in your configuration.

解决步骤

1. 升级Hibernate到兼容Jakarta的版本

Spring Boot 3.0完全迁移到Jakarta EE API,要求Hibernate 6.x版本(你的当前5.4.x仅支持javax.persistence):

  • 修改gradle.properties中的hibernateVersion为6.1.7.Final(Spring Boot 3.0.0默认依赖版本)
  • 移除手动引入的jakarta.persistence:jakarta.persistence-api依赖,spring-boot-starter-data-jpa已包含兼容的API版本,手动引入会导致冲突

2. 移除hibernate-core的排除配置

在spring-boot-starter-data-jpa依赖中,你排除了核心的Hibernate实现,导致Spring无法自动配置EntityManagerFactory:

implementation ("org.springframework.boot:spring-boot-starter-data-jpa"){
    exclude group : 'org.yaml' , module : 'snakeyaml'
    // 删除此行排除配置
    // exclude group: 'org.hibernate.orm', module: 'hibernate-core'
}

3. 优化EntityManagerFactory的使用方式

避免手动调用Persistence.createEntityManagerFactory(),改用Spring注入的方式管理,减少资源泄漏和版本兼容问题:

@Autowired
private EntityManager entityManager;

@Override
public boolean isTenantSchemaExist(String tenantId) {
    Query getSchemasQuery = entityManager.createNativeQuery(TENANT_SCHEMA_EXIST_QUERY);
    List<String> tenantSchemas = new ArrayList<>(getSchemasQuery.getResultList());
    return tenantSchemas.contains(tenantId);
}

4. 升级其他兼容依赖

  • Flyway:升级到8.5.13(Spring Boot 3.0.0默认版本),旧版6.x不支持Jakarta
  • PostgreSQL驱动:升级到42.5.1,确保兼容Jakarta API
  • AWS SDK:1.11+版本存在Jakarta兼容风险,建议升级到AWS SDK v2,或至少使用最新的1.12.x版本

5. 清理依赖冲突

运行./gradlew dependencies检查依赖树,确保所有JPA相关依赖均为jakarta.persistence前缀,无遗留的javax.persistence依赖。


内容的提问来源于stack exchange,提问作者Meherban

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 04:01:13