首页 > 解决方案 > @Cacheable 用于默认的 spring data jpa 方法而不覆盖它们

问题描述

抱歉,如果我的问题不是新问题但我找不到答案。我使用 Spring Data JPA 和 Spring Cache。我有以下存储库

@CacheConfig(cacheNames = "Category")
@Cacheable
@Repository
public interface Repository extends CrudRepository<Category, Long> {

    Category findByCategory(String Category);
}

而且我想缓存默认的 CrudRepository 方法,例如 findAll() 等。如果我像这样覆盖它们,它就可以工作

    @CacheConfig(cacheNames = "Category")
    @Cacheable
    @Repository
    public interface Repository extends CrudRepository<Category, Long> {

        Category findByCategory(String Category);
        List<Category> findAll();

    }

但是对于每个存储库,每次都覆盖它们并不方便。

有没有办法缓存默认spring jpa方法而不覆盖它们或没有这样的方式?

标签: springspring-data-jpaspring-cache

解决方案


是的,我们可以做到。基本上,Spring 使用 Hibernate ORM 作为 JPA 的实现。Hibernate 本身支持缓存功能,并且会比 Spring Cache 更好地集成。

要启用 L2 缓存,请将这些属性添加到您的项目中添加以下属性。

spring.jpa.properties.hibernate.cache.use_second_level_cache=true spring.jpa.properties.hibernate.cache.use_query_cache=true spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory

和依赖项 hibernate-ehcache

完成此操作后,您的 JPA 的所有默认方法(如findOne(), )findAll()都将被缓存。

如果您添加任何自定义方法,您可以添加如下:

@QueryHints({ @QueryHint(name = "org.hibernate.cacheable", value ="true") }) Category findByCategory(String Category);

要测试默认方法的缓存位置,可以使用以下属性查看是否已执行 SQL。

spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true


推荐阅读