1

我有这些方法:

@Cacheable(value="products")
public Product findByName(String name)
@CacheEvict(value = "products", key="#productId")
public boolean updateProduct(int productID)

产品有一个字段 id,它是键。

现在我遇到了问题,findByName 方法在使用更新方法后仍然可以找到旧对象。我认为,问题在于 findByName 将对象存储在键名而不是 productId 下。在方法参数中,我没有 productId。但我不知道,如何告诉 Spring 缓存使用返回对象的属性。

4

2 回答 2

2

您不能将返回对象的字段用作缓存键。只有输入参数对key="#someFieldName"参数有效。

如果您在处理过时的对象时遇到问题,您可能需要在使用与以下方法不同的键类型的产品更新后逐出整个缓存findByName

@CacheEvict(value = "products", allEntries = true) 
于 2012-10-25T09:05:00.227 回答
0

这是与 Spring-cache 框架一起运行的相当常见的限制。当它成为一个问题时,我通常围绕它设计的方式是在调用中包含应该驱逐缓存的所需参数,即使它不需要。像这样:

@CacheEvict(value = "products", key="#productName")
/* productName only needed for CacheEvict... */
public boolean updateProduct(int productID, String productName) {
...
}
于 2012-10-25T12:58:53.900 回答