2014-11-20 3 views
0

Я 2 метод как это:CacheEvict из коллекции Iterable

первый, я хочу заставить пользователей депозит

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

но что нет работы.

ответ

2

CacheEvict работает над товаром, а не итератором на предметы. В вашем коде есть запах: если вы посмотрите на выражения SpEL, они написаны как объект, который был объектом выселения, в то время как его тип параметра ясно говорит, что он другой.

Есть еще одна проблема с получением. Вы помещаете что-то в кеш без ключа, а контент зависит от подключенного пользователя. Вы должны сделать эту информационную часть ключа. В настоящий момент каждый новый вызов отменяет содержимое кеша. Хуже того, если вы кешируете одного пользователя, а затем вызываете этот метод с другим зарегистрированным пользователем, он получит депозит другого пользователя!

Смежные вопросы