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

Spring非Boot Maven项目升级至Java 11及依赖时EntityManagerFactory持久化提供者类冲突问题排查

问题分析与解决方案

你的问题核心是Spring 5.x 与 Hibernate 6.x 的 API 不兼容,具体来说:

  • Spring 5.3.x 系列依赖的是传统 Java EE 规范下的 javax.persistence.* 包(JPA 2.x)
  • 而 Hibernate 6.x 已经全面切换到 Jakarta EE 规范的 jakarta.persistence.* 包(JPA 3.x)
    这就导致 HibernatePersistenceProvider 实现的是 Jakarta 版本的 PersistenceProvider,但 Spring 的 setPersistenceProviderClass 方法要求的是 Java EE 版本的接口,类型完全不匹配。

另外你看到的字节码版本差异是正常现象:Spring 5.3.x 编译时的目标字节码是 Java 8(它兼容运行在 Java 11+ 环境),而 Hibernate 6.x 最低要求 Java 11,所以编译目标是 Java 11,IntelliJ 只是如实显示了两者的编译版本,这不是错误根源。

可行的解决方案

方案一:降级 Hibernate 到兼容 Spring 5.x 的版本

如果你想继续使用 Spring 5.3.x(因为它支持 Java 11),请将 Hibernate 降级到 5.6.x 系列——这是 Hibernate 最后一批支持 javax.persistence 包的版本,同时完全兼容 Java 11。

修改你的 Maven 依赖:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.6.15.Final</version> <!-- 最新的5.6.x稳定版 -->
</dependency>

这个版本的 HibernatePersistenceProvider 实现的是 javax.persistence.spi.PersistenceProvider,和 Spring 5.3.x 的 setPersistenceProviderClass 方法要求的类型完全匹配。

方案二:升级 Spring 到支持 Jakarta API 的版本(注意Java版本要求)

如果你想保留 Hibernate 6.x,就必须升级 Spring 到 6.x 系列,但 Spring 6.x 的最低要求是 Java 17,这意味着你需要把项目的 JDK 从 11 升级到 17。如果可以接受这个升级,修改 Spring 版本:

<org.springframework.version>6.1.5</org.springframework.version> <!-- 最新的Spring 6稳定版 -->

Spring 6.x 全面切换到了 Jakarta EE 规范,和 Hibernate 6.x 的 API 完全兼容。

额外提示

在升级过程中,注意检查所有依赖的 JPA 相关组件(比如 Spring Data JPA、Flyway 等),确保它们的版本和你选择的 Spring/Hibernate 版本兼容:

  • 如果用方案一(Spring 5.3 + Hibernate 5.6),Spring Data JPA 应该用 2.7.x 系列
  • 如果用方案二(Spring 6 + Hibernate 6),Spring Data JPA 应该用 3.x 系列

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 20:34:06