findOne メソッドに「Cacheable」アノテーションを追加し、delete メソッドまたは occur メソッドが発生したときにキャッシュを削除したいと考えています。
どうやってやるの ?
virsir では、Spring Data JPA (インターフェースのみを使用) を使用する場合、もう 1 つの方法があります。ここで私が行ったこと、同様の構造化されたエンティティのジェネリック dao:
public interface CachingDao<T, ID extends Serializable> extends JpaRepository<T, ID>, JpaSpecificationExecutor<T> {
@Cacheable(value = "myCache")
T findOne(ID id);
@Cacheable(value = "myCache")
List<T> findAll();
@Cacheable(value = "myCache")
Page<T> findAll(Pageable pageable);
....
@CacheEvict(value = "myCache", allEntries = true)
<S extends T> S save(S entity);
....
@CacheEvict(value = "myCache", allEntries = true)
void delete(ID id);
}
基本的に@sevenの答えは正しいと思いますが、2つの欠けている点があります:
ジェネリック インターフェイスを定義することはできません。残念ながら、アノテーションは継承できず、リポジトリごとに異なるキャッシュ名が必要になるため、すべての具体的なインターフェイスを個別に宣言する必要があります。
save
でdelete
ある必要がありCachePut
、findAll
両方Cacheable
である必要がありますCacheEvict
public interface CacheRepository extends CrudRepository<T, String> {
@Cacheable("cacheName")
T findOne(String name);
@Cacheable("cacheName")
@CacheEvict(value = "cacheName", allEntries = true)
Iterable<T> findAll();
@Override
@CachePut("cacheName")
T save(T entity);
@Override
@CacheEvict("cacheName")
void delete(String name);
}
私はこれを次の方法で解決し、正常に動作しました
public interface BookRepositoryCustom {
Book findOne(Long id);
}
public class BookRepositoryImpl extends SimpleJpaRepository<Book,Long> implements BookRepositoryCustom {
@Inject
public BookRepositoryImpl(EntityManager entityManager) {
super(Book.class, entityManager);
}
@Cacheable(value = "books", key = "#id")
public Book findOne(Long id) {
return super.findOne(id);
}
}
public interface BookRepository extends JpaRepository<Book,Long>, BookRepositoryCustom {
}
ここで説明されているように、 MyCRUDRepository (インターフェイスと実装) を提供してみてください:カスタム動作をすべてのリポジトリに追加します。次に、これらのメソッドのアノテーションをオーバーライドして追加できます。
findOne(ID id)
delete(T entity)
delete(Iterable<? extends T> entities)
deleteAll()
delete(ID id)