我有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);
但是没有用。
答案 0 :(得分:2)
CacheEvict
适用于项而不是项上的迭代器。你的代码中有一股气味:如果你看SpEL表达式它们被写成实体就是被驱逐的对象,而它的参数类型清楚地表明它是不同的。
get有另一个问题。您正在缓存中放入没有密钥的内容,内容取决于连接的用户。您应该将该信息作为密钥的一部分。现在,每个新调用都会覆盖缓存的内容。更糟糕的是,如果您缓存一个用户,然后使用其他登录用户调用该方法,它将获得另一个用户的存款!