如何在 Spring @cacheput收集?

8yoxcaq7  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(295)

我正在使用的缓存 Ehcache3 作为提供者。假设我有这样的方法:

@Transactional
@Cacheable(cacheNames = "findAllPosts")
public Page<Post> getAllPosts(Pageable pageable) {
    return postRepository.findAll(pageable);
}

@Transactional
@Cacheable(cacheNames = "findPostById")
public Post findById(Long id) {
    return postRepository.findById(id).orElseThrow(exceptionHelper.getEntityNotFoundException(id, Post.class));
}

@Transactional
@CachePut(cacheNames = "findPostById", key = "#result.id")
public Post update(Long postId, Post postToUpdate) {
    Post post = postRepository.getOne(postId);
    post.setTitle(postToUpdate.getTitle());
    post.setContent(postToUpdate.getContent());
    post.setUpdated(LocalDateTime.now());
    return post;
}

我当然想缓存这个方法。它起作用了,但是 @CachePut 只影响 findPostById 不影响 findAllPosts 即使我加上 findAllPosts 去缓存名字。当我更新文章时,它对单个文章(按id)是可见的,而不是对 getAllPosts (此方法的缓存未更新)。如何不仅更新单个实体,而且更新整个集合?有什么类似的吗 @CollectionCache ?

ifmq2ha2

ifmq2ha21#

解决这个问题的一个方法是,每当更新一个元素时,就逐出列表的缓存。
您必须自动连接cachemanager,从那里访问缓存,并在update方法中手动收回所需内容。
示例代码:

@Autowired 
private CacheManager cacheManager;

@Transactional
@CachePut(cacheNames = "findPostById", key = "#result.id")
public Post update(Long postId, Post postToUpdate) {

    Cache allPostsCache = cacheManager.getCache("cacheName").evict("cacheKey");

    Post post = postRepository.getOne(postId);
    post.setTitle(postToUpdate.getTitle());
    post.setContent(postToUpdate.getContent());
    post.setUpdated(LocalDateTime.now());
    return post;
}

当然,您需要用您的值替换“cachename”和“cachekey”。

相关问题