受this answer的启发,我尝试了以下操作
@NoRepositoryBean
public interface CacheableRepository<T, ID extends Serializable>
extends JpaRepository<T, ID>, JpaSpecificationExecutor<T>, PagingAndSortingRepository<T, ID> {
@Cacheable()
T findOne(ID id);
@Cacheable()
List<T> findAll();
@Cacheable()
Page<T> findAll(Pageable pageable);
@CacheEvict(allEntries = true)
<S extends T> S save(S entity);
@CacheEvict(allEntries = true)
void delete(ID id);
}
然后使用此接口定义Used存储库
@CacheConfig(cacheNames={"uniqueCache"})
public interface SomeObjectRepo extends CacheableRepository<SomeObject, Long> {
@Cacheable(key = "someobject+#p0")
List<SomeObject> findByType(Integer type);
@Cacheable(key = "someobject+#p0")
List<SomeObject> findByCategory(String field);
@Cacheable(key="someobject+#p0.concat(#p1)")
List<SomeObject> findByCategoryAndWizardType_id(String field,Integer id);
}
作品:
该高速缓存适用于findByType
、findByCategory
和findByCategoryAndWizardType_id
不工作:
对于在CacheableRepository
定义的所有cacheable
方法,SomeObjectRepo
上的CacheConfig
注解似乎不影响CacheableRepository
。
我的问题:
为什么注解不起作用?有没有变通办法让这个结构起作用?
谢谢,奥克
2条答案
按热度按时间zlhcx6iw1#
是的,这差不多就是奥利和我在试图支持这种情况时发现的。
我建议您在spring data项目中创建一个问题来请求该特性。
ycl3bljg2#
通过使用如下所示的
CacheResolver
,可以根据目标存储库的名称(执行了其方法)来确定该高速缓存名称。用于定义默认
CacheResolver
的配置:使用这个解决方案,不需要指定缓存名称,因为所有可缓存的方法都缓存在
SomeObjectRepo
缓存名称下。注意:要缓存类方法,应该向
getCacheNames
添加额外的逻辑,否则它将无法工作。