Ehcache Spring — собственный генератор ключей

Я работал с 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, и мне нужно использовать personId человека в качестве ключа для кэширования.

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


person jmj    schedule 06.10.2011    source источник
comment
Можете ли вы перейти на Spring 3.1 абстракция кэша? Затем ваш вариант использования легко достижим с помощью аннотации @Cacheable(key="#person.personId").   -  person Tomasz Nurkiewicz    schedule 06.10.2011
comment
@Tomasz, дай мне посмотреть. Благодарность   -  person jmj    schedule 06.10.2011
comment
@ Томаш Это сработало. Я перешел на Spring Cachable Abstraction   -  person jmj    schedule 24.10.2011
comment
Рад, что смог помочь, я повысил свой комментарий до ответа, если вы сочтете его полезным.   -  person Tomasz Nurkiewicz    schedule 24.10.2011


Ответы (3)


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

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

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

аннотация.

person Tomasz Nurkiewicz    schedule 24.10.2011

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

Если метод updatePerson принимает модифицированный Person, который вы сохраняете, вам необходимо аннотировать метод обновления с помощью TriggersRemove, чтобы удалить обновленный объект Person из кеша. Затем вам нужно перезапустить метод 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);
 }
person atrain    schedule 06.10.2011
comment
Это смелое заявление; приведенный выше код является официальным примером кода используемой вами библиотеки. - person atrain; 06.10.2011
comment
Код, который вы связали, не относится к решению моей проблемы, и я удаляю этот комментарий, так как думаю, что неправильно его понял. простите за это. но ваш ответ все еще не отвечает на мой вопрос - person jmj; 06.10.2011
comment
или если вы думаете, что это отвечает, а я не понял, пожалуйста, уточните и прокомментируйте - person jmj; 07.10.2011
comment
Это проблема на самом деле. что просто для обновления Pojo нам нужно передать два аргумента по-разному - person jmj; 07.10.2011

Попробуйте добавить @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);
 }
person Fernando Ortega    schedule 02.09.2013