如何添加缓存功能在Spring数据JPA CRUDRepository(How to add cac

2019-07-05 13:26发布

我想补充的findOne法“可缓存”的注释,并驱逐缓存时删除或发生的方法发生了。

我怎样才能做到这一点 ?

Answer 1:

virsir,还有一个方式,如果你使用Spring数据JPA(只使用接口)。 在这里我做了什么,对类似结构的实体genereic道:

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);
}


Answer 2:

我觉得基本上@ SEVEN公司的答案是正确的,但与2失分:

  1. 我们不能定义一个通用的接口,恐怕我们不得不单独申报每一个具体的接口,因为注释不能被继承,我们需要为每个库不同的缓存名称。

  2. savedeleteCachePutfindAll既要CacheableCacheEvict

     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); } 

参考



Answer 3:

我解决了这个以下列方式和它的做工精细


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 {

}


Answer 4:

尝试提供MyCRUDRepository(一个接口和一个实现)作为解释在这里: 添加自定义行为所有存储库 。 然后,你可以重写,并添加注释这些方法:

findOne(ID id)
delete(T entity)
delete(Iterable<? extends T> entities)
deleteAll() 
delete(ID id) 


文章来源: How to add cache feature in Spring Data JPA CRUDRepository