В этом случае вы хотите использовать @CachePut
в вашем сервисном методе, выполняющем создание или обновление.Например ...
Предполагая ...
class Customer {
@Id
Long id;
...
}
И учитывая ...
@Service
class CustomerService {
CustomerRepository customerRepository;
@CachePut("Customers", key="#customer.id")
Customer createOrUpdate(Customer customer) {
// validate customer
// any business logic or pre-save operations
return customerRepository.save(customer);
}
}
@Cacheable
собирается выполнить look-в сторону в именованном кэше перед выполнением createOrUpdate(:Customer)
.Если Клиент с идентификатором уже существует в именованном кэше, Spring возвратит «кэшированный» Customer
;Spring не будет выполнять метод создания / обновления в этом случае.
Однако, если идентифицированный Customer
не существует (или недействителен), Spring продолжает выполнять метод createOrUpdate(:Customer)
и затем кэширует результатметода.
В случае @CachePut
Spring всегда будет выполнять метод createOrUpdate(:Customer)
.То есть Spring не будет выполнять просмотр в сторону, чтобы определить, существует ли Customer перед выполнением метода, что, скорее всего, то, что вам нужно в случае создания / обновления.
В любом случае, больше информации о декларативномКэширование на основе можно найти в Справочном руководстве .В частности, посмотрите на @CachePut
документы и сравните это с @Cacheable
документами .
Надеюсь, это поможет!-John