Ehcache Spring-自定义密钥生成器

时间:2011-10-06 15:41:33

标签: java spring annotations ehcache

我正在使用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作为缓存的键。

这可以通过为每个类隐藏CacheKeyGenerator或者放置if / else的块来实现,但是我们可以使用一些可配置的东西来赋予参数字段作为键吗?

3 个答案:

答案 0 :(得分:3)

您可以切换到Spring 3.1 cache abstraction吗?

您的用例可以通过以下方式轻松解决:

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

注释

答案 1 :(得分:0)

这可以通过注释完成。

如果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);
 }

答案 2 :(得分:0)

尝试将@PartialCacheKey添加到getPerson方法的personId参数中。

就像这样:

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