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

