我如何在 Spring 中使用 @CachePut 进行收集?

如何解决我如何在 Spring 中使用 @CachePut 进行收集?

对于缓存,我使用 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 添加到 cacheNames 也不影响 findAllPosts。当我更新 Post 时,它对单个帖子(按 id)可见,而不是 getAllPosts(此方法未更新缓存)。我该怎么做才能不仅更新单个实体而且更新整个集合?有没有类似 @CollectionCache 的东西?

解决方法

对此的一种解决方案是在单个元素更新时逐出列表的缓存。

您必须自动装配 cacheManager,从那里访问缓存并在更新方法中手动逐出您需要的内容。

示例代码:

@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”。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?