升级Hibernate/Spring依赖时遇JpaIntegrator缺失的ServiceConfigurationError
解决Hibernate升级后JpaIntegrator找不到的ServiceConfigurationError问题
我之前处理过好几起类似的依赖升级踩坑案例,你遇到的这个报错本质是Hibernate的JPA集成类JpaIntegrator在类路径中找不到,核心原因通常是依赖缺失、模块版本不匹配或者依赖冲突导致的类加载失败。下面是一步步的排查和解决方法:
1. 先确认Hibernate模块的版本一致性
Hibernate 5.2及以后的版本已经把hibernate-entitymanager模块的功能合并到hibernate-core里了,如果你之前的项目还在单独引入hibernate-entitymanager,很可能会和新版hibernate-core产生冲突,导致JpaIntegrator类要么重复存在要么缺失。
- 检查你的依赖配置(Maven pom.xml或Gradle build.gradle),确保只引入**
hibernate-core**,移除旧的hibernate-entitymanager依赖。 - 确保所有Hibernate相关模块(比如
hibernate-commons-annotations、hibernate-jpa-api等)的版本和你指定的hibernateVersion完全一致,避免混合不同版本。
2. 检查Spring ORM与Hibernate的版本兼容性
虽然你试过Spring 5.1.6 + Hibernate 5.4.2,但还是要确认版本是否匹配:
- Spring 4.3.x系列官方最高支持到Hibernate 5.2.x,如果你用Spring 4.3.20搭配Hibernate 5.4.x,大概率会有兼容性问题(比如Spring ORM的Hibernate封装类和新版Hibernate的API不匹配)。
- 建议使用Spring 5.1+ 搭配 Hibernate 5.4.x,或者Spring 4.3.x搭配Hibernate 5.2.x,先把版本对齐到官方兼容的组合再测试。
3. 清理依赖树中的冲突依赖
很多时候问题出在间接依赖的旧版本Hibernate模块上,比如Spring依赖或者其他第三方库悄悄引入了旧版Hibernate。
Maven用户:
执行命令查看依赖树,找出所有Hibernate相关的依赖:
mvn dependency:tree | grep hibernate
如果发现有旧版本的Hibernate模块,在你的依赖中通过<exclusions>排除掉,比如:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${springVersion}</version> <exclusions> <exclusion> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> </exclusion> </exclusions> </dependency>
Gradle用户:
执行命令查看依赖树:
gradle dependencies | grep hibernate
然后用exclude排除冲突的依赖:
compile('org.springframework:spring-orm') { exclude group: 'org.hibernate', module: 'hibernate-core' }
4. 手动指定Integrator作为兜底方案
如果上面的方法都试过还是不行,可以尝试绕过ServiceLoader加载,手动在LocalSessionFactoryBean中指定JpaIntegrator:
@Configuration public class HibernateConfig { @Bean public LocalSessionFactoryBean sessionFactory(DataSource dataSource) { LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); sessionFactory.setDataSource(dataSource); sessionFactory.setPackagesToScan("com.yourpackage.entity"); // 手动添加JpaIntegrator sessionFactory.setIntegrators(new org.hibernate.jpa.event.spi.JpaIntegrator()); // 其他Hibernate配置... Properties hibernateProperties = new Properties(); hibernateProperties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect"); sessionFactory.setHibernateProperties(hibernateProperties); return sessionFactory; } }
注意:这个方法前提是JpaIntegrator类已经在类路径中,所以还是要先确保依赖正确。
最后验证步骤
- 清理项目的构建缓存(Maven的
clean,Gradle的clean) - 重新构建项目
- 启动应用,检查报错是否消失
内容的提问来源于stack exchange,提问作者Noname Noferstname
相关产品推荐
相关产品推荐

