19

findOne メソッドに「Cacheable」アノテーションを追加し、delete メソッドまたは occur メソッドが発生したときにキャッシュを削除したいと考えています。

どうやってやるの ?

4

4 に答える 4

13

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);
}
于 2013-10-31T13:57:27.007 に答える
9

基本的に@sevenの答えは正しいと思いますが、2つの欠けている点があります:

  1. ジェネリック インターフェイスを定義することはできません。残念ながら、アノテーションは継承できず、リポジトリごとに異なるキャッシュ名が必要になるため、すべての具体的なインターフェイスを個別に宣言する必要があります。

  2. savedeleteある必要がありCachePutfindAll両方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);
    }
    

参照

于 2016-01-29T09:01:47.313 に答える
5

私はこれを次の方法で解決し、正常に動作しました


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 {

}
于 2013-04-03T05:12:41.373 に答える
2

ここで説明されているように、 MyCRUDRepository (インターフェイスと実装) を提供してみてください:カスタム動作をすべてのリポジトリに追加します。次に、これらのメソッドのアノテーションをオーバーライドして追加できます。

findOne(ID id)
delete(T entity)
delete(Iterable<? extends T> entities)
deleteAll() 
delete(ID id) 
于 2012-12-17T15:53:52.923 に答える