После @CachePut findAll () не дает результата из кеша - PullRequest
0 голосов
/ 07 мая 2020

Я изучаю кеширование весенней загрузки, чтобы применить эту концепцию в проекте нашей организации, и я сделал образец проекта под названием «Кэш сотрудников». У меня есть четыре метода в моем контроллере и компоненте службы insert, update, get и getAll.For insert and get @Cacheable работает отлично. Теперь я звоню getAllEmployee() в первый раз, тогда он получает данные из базы данных. После этого я пытаюсь обновить с помощью @CachePut, он обновляет значение в базе данных, и снова я вызываю getAllEmployee(), тогда он не возвращает обновленное значение из кеша. Я также ссылаюсь на документацию для @CachePut. Я также ссылаюсь на некоторые другие документы, такие как this и this , но я не решил свою проблему. Кроме того, когда я звоню, ошибка не возникает.
То, что я пробовал, это
Это два моих API из EmplyeeController.java

@PostMapping(value = "/updateSalary")
private Boolean updateSalary(@RequestParam int salary, @RequestParam Integer id) {
    return empService.updateSalary(salary, id);
}

@GetMapping(value = "/getAllEmployee")
private Object getAllEmployee() {
    List<EmployeeMapping> empList = empService.getAllEmployee();
    return !empList.isEmpty() ? empList : "Something went wrong";
}

Это два моих метода из EmployeeService.java. Я применил разные ключи для обновления метода, но не сработало. Мой метод getAll() не имеет параметров, поэтому я попробовал все методы ключей для методов без параметров из здесь , тогда я также не получил никаких результатов.

@CachePut(key = "#root.method.name")
public Boolean updateSalary(int salary, int id) {
    System.err.println("updateSalary method is calling in service");
    if (empRepo.salary(salary, id) != 0) {
        return true;
    }
    return false;
}

@Cacheable(key = "#root.method.name")
public List<EmployeeMapping> getAllEmployee() {
    return empRepo.findAllEmployee();
}

Это мои два методы из EmployeeRepository.java. Я использовал @SqlResultSetMappings и @NamedNativeQueries в EmployeeMetaModel.java с EmployeeMapping.java, но в нативном запросе EmployeeMetaModel.java нет ошибок, потому что он дает результат из базы данных.

@Transactional
@Modifying
@Query("update employee_cache e set e.salary = ?1 where e.id = ?2")
int salary(int salary, int id);

@Query(name = "EmployeeListQuery", nativeQuery = true)
List<EmployeeMapping> findAllEmployee();

Пожалуйста, помогите мне получить избавиться от этого мне просто нужно обновленное значение из кеша, используя getAllEmployee() после вызова updateSalary().

1 Ответ

0 голосов
/ 08 мая 2020

Возникла проблема с тем, как вы определили кеширование с помощью аннотаций. Ваши @CachePut и @Cacheable не используют один и тот же ключ кеша. На самом деле у вас должно получиться что-то вроде этого:

@CachePut(value = "employees", key = "T(org.springframework.cache.interceptor.SimpleKey).EMPTY")
public List<EmployeeMapping> updateSalary(int salary, int id) {
    // update salary and return the list of employees
}

@Cacheable(value = "employees")
public List<EmployeeMapping> getAllEmployee() {
    // return the list of employees
}

Здесь @CachePut и @Cacheable имеют одинаковый ключ кеширования. D Теперь, когда вы вызываете метод updateSalary(), @CachePut заменяет существующее кэшированное значение для ключа «сотрудники» с результатом метода, т.е. списком сотрудников с обновленной зарплатой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...