@Cacheable 用于默认 spring 数据 jpa 方法而不覆盖它们

@Cacheable for default spring data jpa methods without overriding them

对不起,如果我的问题不是新问题但我找不到 answer.I 使用 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 方法而不覆盖它们或没有这种方法?

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

更好地集成

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

spring.jpa.properties.hibernate.cache.use_second_level_cache=真 spring.jpa.properties.hibernate.cache.use_query_cache=真 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=真 spring.jpa.properties.hibernate.format_sql=真