2014-11-20 3 views
0

이 추천 방법 내가 한 : 작업 개체 저장 관계로 한 예금을 포함하는 때, 사용자의 예금을CacheEvict이

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

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

    Set<Deposit> deposits = user.getBalance().getDeposits(); 
    return deposits; 
} 

및 초

첫번째 얻을 수있어, 내가 퇴거 할

(봄 데이터 인터페이스)

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

하지만 : ID로 캐시로부터 입금 아무 일 없다.

답변

2

CacheEvict은 항목의 반복기가 아닌 항목에서 작동합니다. 코드에 냄새가 있습니다. SpEL 표현식을 보면 엔티티로 쓰여지고 SpEL 표현식은 매개 변수 유형이 분명히 다르다는 것을 나타내면서 퇴출 대상입니다.

get에 또 다른 문제가 있습니다. 키없이 어떤 것을 캐시에 넣고 있으며 연결된 사용자에 따라 내용이 달라집니다. 그 정보를 키의 일부로 만들어야합니다. 현재 각각의 새로운 호출은 캐시의 내용을 덮어 씁니다. 한 사용자를 캐시 한 다음 다른 사용자로 로그인하면 다른 사용자의 보증금을 받게됩니다.