Spring4.3.9+Hibernate5.2.10环境下CacheImplementor创建失败求助
嘿,我来帮你捋捋这个问题——你遇到的org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.spi.CacheImplementor]错误,哪怕禁用二级缓存还出现,说明问题可能不在缓存配置本身,而是初始化流程里的遗留配置、依赖冲突或者Spring集成的问题。咱们一步步排查:
1. 确认二级缓存是否真的被彻底禁用
Hibernate 5.x里禁用二级缓存需要同时设置两个配置项,而且要确保实体类上没有残留缓存注解:
- 在你的Hibernate配置文件(
hibernate.cfg.xml/persistence.xml)里添加或修改:
同时删掉或注释掉hibernate.cache.use_second_level_cache=false hibernate.cache.use_query_cache=falsehibernate.cache.region.factory_class这一行——既然禁用缓存了,就不需要指定区域工厂了,留着反而可能触发初始化逻辑。 - 检查所有实体类,确保没有
@Cache、@Cacheable这类缓存相关的注解,哪怕全局禁用,Hibernate遇到这些注解还是会尝试初始化缓存区域。
2. 检查Maven依赖的版本兼容性
Hibernate 5.x对hibernate-ehcache和ehcache的版本有严格要求,版本不匹配很容易出现类加载或初始化错误:
- 确保
hibernate-ehcache的版本和hibernate-core完全一致(都是5.2.10.Final),因为Hibernate的模块版本必须对齐。 - EhCache要使用2.x版本(比如2.10.6),Hibernate 5.2.x不兼容EhCache 3.x(3.x是基于JCache规范的,需要用
hibernate-jcache而不是hibernate-ehcache)。
正确的Maven依赖示例:
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.2.10.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-ehcache</artifactId> <version>5.2.10.Final</version> </dependency> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>2.10.6</version> </dependency>
3. 排查Spring与Hibernate的集成配置
如果你用Spring的LocalSessionFactoryBean来配置Hibernate,要确保没有硬编码设置缓存区域工厂:
- 检查Spring配置文件或Java配置类,有没有类似这样的代码:
如果有,注释掉或删除这一行——Spring的配置优先级可能高于Hibernate的配置文件,就算你在配置文件里禁用了缓存,Spring这边的硬编码还是会触发缓存初始化。sessionFactoryBean.setCacheRegionFactory(new SingletonEhCacheRegionFactory());
4. 检查类路径中的冲突依赖
有时候项目里会引入其他缓存相关的依赖,比如hibernate-jcache、spring-boot-starter-cache(如果是Spring Boot项目),这些依赖可能会干扰Hibernate的缓存初始化流程。
- 用
mvn dependency:tree命令查看依赖树,排查有没有多余的缓存相关jar包,比如hibernate-jcache,如果有,排除掉这些依赖。
5. 分析完整调用堆栈
你提到有完整的调用堆栈,仔细看看堆栈里的根因——比如如果有ClassNotFoundException或NoClassDefFoundError,那就是依赖缺失或版本不对;如果有IllegalStateException,可能是配置冲突。比如如果堆栈里提到找不到org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory,那就是hibernate-ehcache依赖没正确引入。
按照这个步骤排查下来,应该能解决问题。如果还是不行,可以把更详细的调用堆栈贴出来,咱们再进一步分析。
内容的提问来源于stack exchange,提问作者Ankur Soni

