0

Hibernate 4.3.11.Final と ehcache および Spring 3.2.11.RELEASE を使用しています。以下の Spring/ehcache 構成があります …</p>

<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>

以下のカスタム キー ジェネレーターを使用して…</p>

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」であるすべてのエントリを第 2 レベルのキャッシュから削除したい場合、どのように記述すればよいかということです。 @CacheEvict ルール? 以下は機能しません…</p>

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

任意のガイダンスをいただければ幸いです。1 つの制約として、複数の第 2 レベル キャッシュを使用することはできません。このアプリケーションには 1 つしか使用できません (「メイン」という名前のキャッシュ)。

4

2 に答える 2

0

短い答えは、これは機能しないということです。それは@CacheEvict注釈の働き方ではありません。

また、ほとんどのキャッシュ実装には、そのような API がネイティブにありません。

于 2016-03-08T17:42:46.063 に答える
0

私はまったく同じ問題を抱えており、「これは一般的なキャッシュの実装が機能する方法ではない」こともわかりました。

そのため、独自のキャッシュ プロバイダーを実装し、選択した実装にある「キーのマッチャー」をオーバーライドする必要があります。

GuavaCache の例に関する適切な回答は、こちらにあります

于 2017-04-17T22:09:19.420 に答える