Caching 是否可以将Cache2k用作hibernate二级缓存和spring缓存管理器?

Caching 是否可以将Cache2k用作hibernate二级缓存和spring缓存管理器?,caching,spring-cache,cache2k,Caching,Spring Cache,Cache2k,我正在使用基于spring的应用程序(而不是spring boot),并尝试将cache2k引入spring缓存管理器 目前,通过设置以下属性,cache2k被用作Hibernate二级缓存 hibernate.cache.use_second_level_cache = true hibernate.cache.region.factory_class = org.hibernate.cache.jcache.JCacheRegionFactory hibernate.javax.cache.

我正在使用基于spring的应用程序(而不是spring boot),并尝试将cache2k引入spring缓存管理器

目前,通过设置以下属性,cache2k被用作Hibernate二级缓存

hibernate.cache.use_second_level_cache = true
hibernate.cache.region.factory_class = org.hibernate.cache.jcache.JCacheRegionFactory
hibernate.javax.cache.provider = org.cache2k.jcache.provider.JCacheProvider
使用以下cache2k.xml配置文件(仅与示例相关的部分)

最终目标是在需要时,但调用以下方法时,在spring缓存层中重用现有的hibernate二级缓存

@Cacheable(cacheNames = "AdvertisingCategoryCache")
@Override
public AdvertisingCategory findById(Long id) {
    // call to the repository
}
我得到以下错误

Cache already created: 'AdvertisingCategoryCache'
关键是我知道缓存已经创建。我的需要是重用现有的一个

我该怎么做


另外,这个例子非常简单,我可以直接删除@Cacheable方法,但我使用它来简单地解释我的情况。

编辑:因为您没有使用Spring Boot,所以需要确保设置将缓存管理器与Hibernate链接的属性

首先,您需要使用JCache,因此必须替换自定义缓存配置以使用JCache(Hibernate没有为cache2k提供缓存抽象实现)

您应该有某种自定义JPA设置,用于配置
EntityManagerFactory
。在该设置中,确保插入您创建的
CacheManager
。如果您有一个注入点,那么上下文将确保在尝试配置Hibernate之前完全解析
CacheManager
(这绝对是您想要的)

完成此操作后,添加以下Hibernate属性:

hibernateProperties.put(ConfigSettings.CACHE_MANAGER, cacheManager.getCacheManager());
其中
cacheManager
JCacheCacheManager
(Spring实现包装了本机
javax.cache.cacheManager

如果您使用Spring Boot,事情会变得更简单。首先,您应该确保让Spring引导配置缓存管理器,而不是自己配置。由于您使用的是用于Hibernate的JCache,所以只需在Spring Boot中使用相同的机制,因为它是完全透明的(我们将把JCache
CacheManager
封装在正确的抽象中)

如果这样做,SpringBoot将确保在hibernate启动之前启动JCache缓存管理器。还有一个明确的操作说明


完成此操作后,将共享同一个缓存管理器。

您好,Stephane,谢谢您的回答。这正是我需要的,但你的答案是指一个Spring Boot应用程序,但正如前面所说,不幸的是,我的不是Spring Boot应用程序。对不起,我错过了。然后,您需要在自定义JPA设置中执行我已经指出的操作。尤其要确保删除其中的最后两个属性,以便Hibernate不会试图自行查找缓存基础结构。我用非Spring引导建议编辑了我的答案
Cache already created: 'AdvertisingCategoryCache'
hibernateProperties.put(ConfigSettings.CACHE_MANAGER, cacheManager.getCacheManager());