0

我有两种这样的方法:

首先,我要让用户存款

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

但那没有用。

4

1 回答 1

2

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

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

于 2014-11-20T19:30:33.320 回答