Spring-orm 5.3.x与Hibernate 6.x整合本地MySQL实例时的类加载异常排查求助
问题根源分析
你的异常核心是java.lang.ClassNotFoundException: javax.transaction.SystemException,结合你的配置和依赖来看,主要是两个关键问题导致的:
- Spring 5.3.x与Hibernate 6.x版本不兼容:Spring 5.x系列基于
javax.persistence规范,而Hibernate 6.x已经完全迁移到jakarta.persistence(Java EE更名Jakarta EE后的新规范),两者API包名不匹配,导致Spring ORM组件无法找到对应的类。 - 缺少JTA事务API依赖:
javax.transaction.SystemException属于JTA事务规范的核心类,你的pom.xml里没有引入这个依赖,直接触发了类加载失败。
具体解决方案
1. 降级Hibernate到Spring 5.3.x兼容版本
Spring 5.3.x和Hibernate 6.x存在API层面的冲突,需要把Hibernate Core版本改为5.6.15.Final(这是Spring官方推荐的兼容版本),修改pom.xml中的依赖:
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.6.15.Final</version> </dependency>
补充:如果想使用Hibernate 6.x,你需要升级Spring到6.x版本,但Spring 6.x要求Java 17及以上,根据你的日志来看当前用的是Java 17,不过如果继续用Spring 5.3.x,必须降级Hibernate。
2. 添加JTA事务API依赖
在pom.xml中加入javax.transaction-api依赖,解决SystemException找不到的问题:
<dependency> <groupId>javax.transaction</groupId> <artifactId>javax.transaction-api</artifactId> <version>1.3</version> </dependency>
3. 统一实体类与DAO的注解包
你的实体类目前使用jakarta.persistence.*注解,而Hibernate 5.x和Spring 5.x默认适配javax.persistence.*,需要替换导入包:
// 替换前 import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.Table; // 替换后 import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table;
同时DAO类中的事务注解也要替换为Spring 5.x对应的包:
// 替换前 import jakarta.transaction.Transactional; // 替换后 import org.springframework.transaction.annotation.Transactional;
4. 优化Hibernate方言配置
针对MySQL 8.0+,建议使用专门的MySQL8Dialect来更好支持新版本特性,修改Spring配置文件中的方言属性:
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</prop>
验证步骤
- 执行
mvn clean install更新依赖并清理旧编译文件 - 重新运行App.java的main方法
- 此时应该能正常执行CRUD操作,版本兼容和依赖缺失的问题都已解决
内容的提问来源于stack exchange,提问作者Soumalya Bhattacharya
相关产品推荐
相关产品推荐

