Ehcache Spring - генератор пользовательских ключей - PullRequest
0 голосов
/ 06 октября 2011

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

У меня есть простой 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 of person в качестве ключа для кеширования.

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

Ответы [ 3 ]

3 голосов
/ 24 октября 2011

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

Ваш вариант использования тогда легко решается:

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

аннотацию.

0 голосов
/ 02 сентября 2013

Попробуйте добавить @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);
 }
0 голосов
/ 06 октября 2011

Все это можно сделать с аннотациями.

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

См. Пример кода на сайте: 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);
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...