spring - @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方法而不覆盖它们或没有这样的方式?
解决方案
是的,我们可以做到。基本上,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
推荐阅读
- meteor - 任何人都可以通过使用 MongoDb 在 React-Native 和 Meteor 中提供输入来帮助我进行搜索吗?
- python - 删除pyspark数据框中值为字符串的行
- postgresql - PSQL 在询问我的帐户密码后才关闭
- javascript - 如何在 Javascript 中从 DOM 中的标签返回文本内容
- javascript - Moment.js | not displaying with intended date format
- kubernetes - 证书对 ingress.local 有效,对 gitlab.mydomain 无效
- javascript - 在 toObject() 函数中使用 getter
- json - 在 JSON 数组中查找匹配项
- ios - 如何从 iPhone 应用程序中过滤 YouTube 内容
- android - 如果在我的应用程序中多次调用 FirebaseDatabase.getInstance().goOnline() 是否会打开多个连接实例?