Spring 从Iterable集合中缓存退出

Spring 从Iterable集合中缓存退出,spring,spring-cache,Spring,Spring Cache,我有两种方法: 首先,我要收取用户押金 @Override @Transactional @Cacheable(value = "deposits") public Set<Deposit> getUserDeposit() { User user = userRepository.findOneByUsername( securityHolder.getUserDetails().getUsername()); Set<Deposi

我有两种方法:

首先,我要收取用户押金

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

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

    Set<Deposit> deposits = user.getBalance().getDeposits();
    return deposits;
}
@覆盖
@交易的
@可缓存(value=“存款”)
公共集getUserDeposit(){
User User=userRepository.findOneByUsername(
securityHolder.getUserDetails().getUsername());
设置存款=user.getBalance().getDeposits();
归还存款;
}
第二,当保存包含一个存放为关系的任务实体时,我希望按id从缓存存放中逐出:

(spring数据接口)

@cacheexecute(value=“存款”,key=“#entity.deposit.id”,condition=“#entity!=null”)
列表保存(Iterable实体);

但这不起作用。

cacheexecute
对项目有效,而不是对项目的迭代器。您的代码中有一种气味:如果您查看SpEL表达式,它们被编写为实体是要逐出的对象,而其参数类型清楚地表明它是不同的

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

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