を使用してSpring Boot, Spring Data, with QueryDSL
います。私のクエリのほとんどはQueryDSL
基づいています。クエリを格納する単純なキャッシュを実装したいのですがUser
、単一のエンティティが削除されるとupdated/saved
、全体Cache
がクリアされます。
だからここに私のリポジトリインターフェースがあります:
@Repository
@CacheConfig(cacheNames = "us")
public interface UserRepository extends JpaRepository<User, Long>, QueryDslPredicateExecutor<User> {
@Cacheable
List<User> findAll();
@Override
@Cacheable
List<User> findAll(Sort sort);
@Override
@Cacheable
List<User> findAll(Iterable<Long> longs);
@Override
@CacheEvict(allEntries = true)
<S extends User> List<S> save(Iterable<S> entities);
@Override
@CacheEvict(allEntries = true)
<S extends User> S saveAndFlush(S entity);
@Override
@Cacheable
Page<User> findAll(Pageable pageable);
@Override
@CacheEvict(allEntries = true)
<S extends User> S save(S entity);
@Override
@Cacheable
User findOne(Long aLong);
@Override
@Cacheable
Iterable<User> findAll(Predicate predicate);
@Override
@Cacheable
User findOne(Predicate predicate);
@Override
@Cacheable
Iterable<User> findAll(Predicate predicate, Sort sort);
@Override
@Cacheable
Page<User> findAll(Predicate predicate, Pageable pageable);
}
ご覧のとおり、すべての「Find」メソッドをキャッシュし、Save メソッドを使用してすべてのエントリを削除しました。通常、使用されるものは次のとおりです。
Page<User> findAll(Predicate predicate, Pageable pageable);
<S extends User> S save(S entity);
はCaching
リポジトリのみに設定され、サービス/コントローラーなどには何も設定されません。
これが私の設定です:
@Bean
public CacheManager cacheManager() {
GuavaCacheManager manager = new GuavaCacheManager();
CacheBuilder<Object, Object> builder = CacheBuilder.newBuilder()
.removalListener(new RemovalListener<Object, Object>() {
@Override
public void onRemoval(RemovalNotification<Object, Object> notification) {
LOG.info("Cache evicted: " + notification);
}
})
.maximumSize(100);
manager.setCacheBuilder(builder);
return manager;
}
@Bean
public KeyGenerator keyGenerator() {
return new SimpleKeyGenerator();
}
また、エンティティにはいくつかのサブクラスがあることを追加する必要がありUser
ますが、すべてをクエリしていますUserRepository
問題は、検索リクエストが正常にキャッシュされても、保存を実行してもキャッシュが削除されないことです。
私が間違っていることはありますか?