Ehcache Spring — генератор пользовательских ключей

#java #spring #annotations #ehcache

#java #spring #аннотации #ehcache

Вопрос:

Я работал с spring-ehcache-аннотациями и столкнулся со следующим сценарием:

У меня есть простой POJO следующим образом

 class Person{
 private Long id;
 private String name
 //some code
}
  

Теперь в DAO у меня есть

 public Person getPerson(Long personId){}

public Person UpdatePerson(Person person){}
  

Теперь в обновлении person мне нужен параметр класса Person, и мне нужно использовать PersonID person в качестве ключа для кеширования.

Это может быть достигнуто путем внедрения CacheKeyGenerator для каждого класса или добавления блоков if / else, но можем ли мы иметь какую-то настраиваемую вещь, чтобы указать поле параметра для использования в качестве ключа?

Комментарии:

1. Можете ли вы переключиться на абстракцию кэша Spring 3.1? Затем ваш вариант использования легко достижим с помощью @Cacheable(key="#person.personId") аннотации

2. @Tomasz дай мне посмотреть. Спасибо

3. @Tomasz Это сработало. Я переключился на абстракцию Spring Cachable

4. Рад, что смог помочь, я добавил свой комментарий к ответу, если вы сочтете его полезным.

Ответ №1:

Можете ли вы переключиться на абстракцию кэша Spring 3.1?

Затем ваш вариант использования легко разрешим с помощью:

 @Cacheable(key="#person.personId")
  

аннотация.

Ответ №2:

Все это можно сделать с помощью аннотаций.

Если updatePerson метод принимает измененный Person , который вы сохраняете, то вам необходимо аннотировать метод обновления TriggersRemove , чтобы удалить обновленного пользователя из кэша. Затем вам нужно повторно getPerson запустить метод для кэширования обновленного пользователя.

Смотрите пример кода на сайте: https://code.google.com/p/ehcache-spring-annotations/source/browse/examples/ehcache-spring-example-1/trunk/src/main/java/com/googlecode/ehcache/annotations/examples/impl/SpringJdbcWeatherServiceImpl.java

Основываясь на updateWeather методе, приведенном в ссылке выше, если я понимаю проблему, вы должны сделать что-то вроде следующего:

 @Cacheable(cacheName="personCache", keyGenerator=@KeyGenerator(
                    name="ListCacheKeyGenerator",properties=@Property(name="includeMethod",value="false")))
public Weather getPerson(Long personId) {
    return (Person)(getSession().get(Person.class, personId));
}

@TriggersRemove(cacheName="personCache", keyGenerator=@KeyGenerator(
                    name="ListCacheKeyGenerator",properties=@Property(name="includeMethod",value="false")))
public Weather updatePerson(@PartialCacheKey Long personId, Person person) {
    getSession().merge(person);           
    return getPerson(personId);
 }
  

Комментарии:

1. Это смелое утверждение; приведенный выше код является официальным примером кода для используемой вами библиотеки.

2. Код, который вы связали, не относится к решению моей проблемы. и я удаляю этот комментарий, поскольку, по-моему, я его неправильно понял. извините за это. но ваш ответ все еще не отвечает на мой вопрос

3. или, если вы считаете, что это отвечает, и я не понял, пожалуйста, уточните и прокомментируйте

4. На самом деле это проблема. это просто для обновления Pojo нам нужно передать два аргумента по-разному

Ответ №3:

Попробуйте добавить @PartialCacheKey к параметру PersonID метода getPerson.

Точно так же, как это:

 @Cacheable(cacheName="personCache", keyGenerator=@KeyGenerator(
                    name="ListCacheKeyGenerator",properties=@Property(name="includeMethod",value="false")))
public Weather getPerson(@PartialCacheKey Long personId) {
    return (Person)(getSession().get(Person.class, personId));
}

@TriggersRemove(cacheName="personCache", keyGenerator=@KeyGenerator(
                    name="ListCacheKeyGenerator",properties=@Property(name="includeMethod",value="false")))
public Weather updatePerson(@PartialCacheKey Long personId, Person person) {
    getSession().merge(person);           
    return getPerson(personId);
 }