来自Iterable集合的CacheEvict

时间:2014-11-20 16:26:52

标签: spring spring-cache

我有2个这样的方法:

首先,我得到用户存款

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

但是没有用。

1 个答案:

答案 0 :(得分:2)

CacheEvict适用于项而不是项上的迭代器。你的代码中有一股气味:如果你看SpEL表达式它们被写成实体就是被驱逐的对象,而它的参数类型清楚地表明它是不同的。

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