2016-03-07 30 views
0

我使用Hibernate 4.3.11.Final與ehcache和Spring 3.2.11.RELEASE。我有下面的春/ ehcache的配置...如何使用部分密鑰從我的二級ehcache中驅逐(通過註釋)?

<cache:annotation-driven key-generator="cacheKeyGenerator" /> 

<bean id="cacheKeyGenerator" class="org.mainco.subco.myproject.util.CacheKeyGenerator" /> 

<bean id="cacheManager" 
    class="org.springframework.cache.ehcache.EhCacheCacheManager" 
    p:cacheManager-ref="ehcache"/> 

<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" 
    p:configLocation="classpath:ehcache.xml" 
    p:shared="true" /> 

<util:map id="jpaPropertyMap"> 
    <entry key="hibernate.show_sql" value="true" /> 
    <entry key="hibernate.dialect" value="org.mainco.subco.myproject.jpa.subcoMysql5Dialect" /> 
    <entry key="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory" /> 
    <entry key="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider" /> 
    <entry key="hibernate.cache.use_second_level_cache" value="true" /> 
    <entry key="hibernate.cache.use_query_cache" value="false" /> 
    <entry key="hibernate.generate_statistics" value="true" /> 
    <entry key="javax.persistence.sharedCache.mode" value="ENABLE_SELECTIVE" /> 
</util:map> 

<bean id="sharedEntityManager" 
    class="org.springframework.orm.jpa.support.SharedEntityManagerBean"> 
    <property name="entityManagerFactory" ref="entityManagerFactory" /> 
</bean> 

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory" /> 
</bean> 

使用下面的自定義密鑰生成器...

public class CacheKeyGenerator implements KeyGenerator 
{ 

    @Override 
    public Object generate(final Object target, final Method method, 
     final Object... params) { 

     final List<Object> key = new ArrayList<Object>(); 
     key.add(method.getDeclaringClass().getName()); 
     key.add(method.getName()); 

     for (final Object o : params) { 
      key.add(o); 
     } 
     return key; 
    } 
} 

正如你所看到的,密鑰生成基於類名,方法名,然後是任何參數。我的問題是,如果我想從我的二級緩存中刪除緩存鍵的第一個條目(因爲我的鍵是一個數組)的所有條目是「org.mainco.subco.standards.repo.StandardsDao」,我該如何編寫這樣的一個@CacheEvict規則?下面不起作用...

@Caching(evict = { @CacheEvict(value="main", key="{'org.mainco.subco.standards.repo.StandardsDao'}")}) 
public int deleteCorrelationTypeContexts(String categoryId) 

任何指導表示讚賞。一個約束,它不是一個使用多個二級緩存的選項 - 我只能爲這個應用程序使用一個(名爲「main」的應用程序)。

回答

0

簡而言之,這是行不通的。那不是@CacheEvict annotation works的方式。

而且大多數緩存實現本身甚至沒有這樣的API。

0

我遇到了同樣的問題,並且發現「這不是普通緩存實現的工作方式」。

所以你需要實現你自己的緩存提供程序,並在你選擇的實現中覆蓋任何「鍵的匹配器」。

使用GuavaCache示例可以找到一個很好的答案here

相關問題