【问题标题】:CacheEvict from Iterable collection来自 Iterable 集合的 CacheEvict
【发布时间】:2014-11-20 16:26:51
【问题描述】:

我有两种这样的方法:

首先,我要让用户存款

@Override
@Transactional
@Cacheable(value = "deposits")
public Set<Deposit> getUserDeposit() {

    User user = userRepository.findOneByUsername(
            securityHolder.getUserDetails().getUsername());

    Set<Deposit> deposits = user.getBalance().getDeposits();
    return deposits;
}

其次,当保存包含一个存款作为关系的任务实体时,我希望通过 id 从缓存存款中逐出:

(弹簧数据接口)

@CacheEvict(value = "deposits", key = "#entity.deposit.id", condition = "#entity != null")
<S extends T> List<S> save(Iterable<S> entity);

但这没有用。

【问题讨论】:

    标签: spring spring-cache


    【解决方案1】:

    CacheEvict 作用于项目而不是项目的迭代器。您的代码中有一种味道:如果您查看 SpEL 表达式,它们被写成实体是要驱逐的对象,而它的参数类型清楚地表明它是不同的。

    get 还有另一个问题。您正在将某些内容放入没有密钥的缓存中,并且内容取决于连接的用户。您应该将该信息作为密钥的一部分。现在每个新调用都会覆盖缓存的内容。更糟糕的是,如果你缓存一个用户,然后用不同的登录用户调用该方法,它会得到另一个用户的存款!

    【讨论】:

      猜你喜欢
      • 2015-11-23
      • 2012-08-27
      • 1970-01-01
      • 2016-10-13
      • 2018-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多