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
相关产品推荐
相关产品推荐

