#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);
}