工具: Spring-Boot:1.5.9.RELEASE Spring-Data-JPA:1.11.9.RELEASE
问题: 目前我有一个扩展自JpaRepository的存储库。为了避免频繁访问数据库,我想在JpaRepository中缓存一些CRUD方法。 我试过了一些方式,从谷歌先生那里找到了一些,但除了其中一种方法外,其他都不起作用。
已编辑 1. 在link中提到的解决方案是可行的。然而,在这里存在一个不良实践(对我来说是冗余)。想象一下,如果我有50个扩展JpaRepository的存储库,这意味着我必须在50个存储库中覆盖保存方法。
public interface UserRepository extends CrudRepository<User, Long> {
@Override
@CacheEvict("user")
<S extends User> S save(S entity);
@Cacheable("user")
User findByUsername(String username);
}
编辑 2. 扩展JpaRepository接口。我在link2看到了一些可能有效的东西。
链接中提到了3种不同的方式来缓存JpaRepository方法。第一种方法与我在#1中提到的相同。然而,我想要类似于第二/三种方法的东西,这样我就不需要在所有存储库中重复覆盖CRUD方法。
以下是我编写的一些示例代码。
@NoRepositoryBean
public interface BaseRepository<T, ID extends Serializable> extends
JpaRepository<T, ID> {
@CacheEvict
<S extends User> S save(S entity);
@Cacheble
T findOne(ID id);
}
@Repository
@CacheConfig("user")
public interface UserRepository extends BaseRepository<User, Integer> {
// when I calling findOne/save method from UserRepository, it should
// caching the methods based on the CacheConfig name defined in the
// child class.
}
然而,似乎上面的代码无法正常工作,因为我收到了以下异常。我理解问题主要是因为在BaseRepository中没有为可缓存注释分配名称所致。但是,我需要缓存从JpaRepository扩展的BaseRepository中的CRUD方法。
java.lang.IllegalStateException: 未使用解析器'org.springframework.cache.interceptor.SimpleCacheResolver@30a9fd0'解析“Builder [public abstract java.util.List com.sdsap.app.repository.BaseRepository.findAll()] caches = [] | key ='' | keyGenerator ='' | cacheManager ='' | cacheResolver ='' | condition ='' | unless ='' | sync ='false'”的任何缓存。每个缓存操作应提供至少一个缓存。
我已经向谷歌先生询问了几天,但仍然找不到合适的解决方案。希望有人能在这里帮助我。如果我的问题不清楚或遗漏了某些内容,请见谅,因为这是我第一次在这里发布。谢谢!