Кэширование Spring Boot Redis: вложенные методы @Cacheable не работают должным образомJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Кэширование Spring Boot Redis: вложенные методы @Cacheable не работают должным образом

Сообщение Anonymous »

Я работаю над проектом Spring Boot, который объединяет Redis, Hibernate, Spring Data JPA и MySQL. Я хочу кэшировать результат метода с помощью аннотации @Cacheable. Однако этот метод внутренне вызывает другой метод, который также помечен аннотацией @Cacheable.
Вот краткое описание проблемы:
У меня есть метод method1, помеченный @Cacheable("method1Cache").
Внутри method1 я вызываю другой метод, method2, который также помечен @Cacheable("method2Cache").
Ожидаемое поведение заключается в том, что оба метода должны кэшировать свои результаты независимо.
Однако похоже, что method2 не кэшируется при вызове из method1.
Проблема: Когда метод 1 вызывает метод 2, кэширование метода 2 не работает должным образом. Если я вызываю метод 2 напрямую, он кэшируется правильно, но когда он вызывается из метода 1, он, похоже, не кэширует вызов репозитория для findAll().
Запрос SELECT в Hibernate все еще выполняется, что указывает на то, что кеш не используется.
Вопрос: Как я могу гарантировать, что оба метода кэшируются независимо, даже когда метод2 вызывается внутри метод1? Существует ли конкретная проблема с кэшированием, когда один метод вызывает другой кэшированный метод, взаимодействующий с репозиторием?
Пример кода:
@Service
public class MyService {

@Cacheable("method1Cache")
public String method1(Long id) {
// Call method2 and perform logic
List myEntity = method2(id);

// Perform some logic with myEntity
return "Relevant result"; // Return something relevant here
}

@Cacheable("method2Cache")
public List method2(Long id) {
// Call repository method to fetch data
return myRepository.findActiveFoodsWithProjection();
}
}

Код репозитория:
@Repository
public interface FoodRepository extends JpaRepository {

@Query("SELECT f.id AS id, f.name AS name FROM Food f WHERE f.isActive = true")
List findActiveFoodsWithProjection();

}

Код FoodProjection:
public interface FoodProjection {

Long getId();
String getName();
}


Подробнее здесь: https://stackoverflow.com/questions/789 ... s-expected
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»