迁移至Spring Boot 2后Hibernate Ehcache二级缓存出现注解异常如何解决?
解决Spring Boot 2迁移后Hibernate Ehcache二级缓存的IncompleteAnnotationException异常
这个问题我之前帮好几个开发者解决过,本质是Spring Boot 2升级后Hibernate和旧Ehcache整合模块的兼容性问题——你用的org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory属于Hibernate和Ehcache 2.x的旧整合方案,而Spring Boot 2配套的Hibernate版本依赖的Terracotta统计注解已经更新,旧模块里的注解缺失了必要的type元素,才会抛出这个异常。
下面是具体的解决步骤:
1. 替换依赖,用新的JCache整合方案
Spring Boot 2推荐遵循JCache(JSR-107)规范来整合缓存,Ehcache 3完全支持这个规范,而且和Hibernate的兼容性更好。
- 先移除旧的
hibernate-ehcache依赖(如果你的项目里有) - 添加以下两个依赖:
Maven(pom.xml)
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-jcache</artifactId> </dependency> <dependency> <groupId>org.ehcache</groupId> <artifactId>ehcache</artifactId> <!-- Spring Boot的parent会自动管理兼容版本,不用手动指定 --> </dependency>
Gradle(build.gradle)
implementation 'org.hibernate:hibernate-jcache' implementation 'org.ehcache:ehcache'
2. 修改Hibernate缓存配置
把原来的旧工厂类替换成JCache的实现,同时补充必要的配置:
application.properties
# 开启二级缓存和查询缓存 spring.jpa.properties.hibernate.cache.use_second_level_cache=true spring.jpa.properties.hibernate.cache.use_query_cache=true # 替换为JCache的区域工厂类 spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.jcache.JCacheRegionFactory # 指定Ehcache作为JCache的提供者 spring.jpa.properties.hibernate.javax.cache.provider=org.ehcache.jsr107.EhcacheCachingProvider # (可选)如果有自定义的Ehcache配置文件,指定路径 spring.cache.jcache.config=classpath:ehcache.xml
application.yml
spring: jpa: properties: hibernate: cache: use_second_level_cache: true use_query_cache: true region: factory_class: org.hibernate.cache.jcache.JCacheRegionFactory javax: cache: provider: org.ehcache.jsr107.EhcacheCachingProvider cache: jcache: config: classpath:ehcache.xml # 可选配置
3. (可选)如果坚持用Ehcache 2.x
如果因为某些原因必须保留Ehcache 2.x,你需要确保Hibernate版本和ehcache版本完全匹配,但这非常容易出现依赖冲突,不推荐。比如你需要锁定hibernate-ehcache的版本为和Hibernate兼容的旧版本,同时排除掉Spring Boot自动引入的新依赖,但这种方式后续会有更多潜在问题,还是建议升级到Ehcache 3 + JCache的方案。
内容的提问来源于stack exchange,提问作者ali akbar azizkhani
相关产品推荐
相关产品推荐

