Попытка выселить кеш второго уровня

Я пытаюсь удалить кэш второго уровня в моем диспетчере сущностей персистентности. Похоже, я могу использовать следующую функцию, определенную в интерфейсе javax.persistence.Cache:

/**
 * Clear the cache.
 */
public void evictAll();

И чтобы получить объект Cache, я могу использовать следующую функцию, определенную в интерфейсе javax.persistence.EntityManagerFactory:

/**
 * Access the cache that is associated with the entity manager
 * factory (the "second level cache").
 * @return instance of the <code>Cache</code> interface
 * @throws IllegalStateException if the entity manager factory
 * has been closed
 *
 * @since Java Persistence 2.0
 */
public Cache getCache();

Я связываю свой EntityManagerFactory так:

@Repository("persistenceManager")
public class PersistenceManager
{
    public EntityManagerFactory emf;

    @PersistenceUnit(unitName="snap")
    public void setEntityManagerFactory(EntityManagerFactory emf) {
        this.emf = emf;
        ...
}

Со следующим файлом конфигурации applicationContext:

< bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    < property name="persistenceUnitName" value="snap" />
    < property name="persistenceUnitManager" ref="pum" />

Когда я вызываю getCache() для объекта, я получаю следующее исключение:

Вызывается: java.lang.AbstractMethodError: org.hibernate.ejb.EntityManagerFactoryImpl.getCache()Ljavax/persistence/Cache; at sun.reflect.NativeMethodAccessorImpl.invoke0(нативный метод) в sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) в sun.reflect.DelegatingMethodAccessorImpl.intho.j.jj.invoke(Method.java:597) в org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.invokeProxyMethod(AbstractEntityManagerFactoryBean.java:376) в org.springframework.orm.jpa.AbstractEntityManagerFactoryBean$ManagedEntityManagerFactoryInvocationHandler.invoke(AbstractEntityManagerFactoryBean.java:517) в com.sun.proxy.$Proxy26.getCache(неизвестный источник) по адресу com.rbccm.gelp.server.util.PersistenceManager.getCache(PersistenceManager.java:30) по адресу com.rbccm.gelp.server.service.SystemDataServiceImpl.evictAllSentLvel (SystemDataServiceImpl.java:133) в sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) в sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) в sun.reflecthodelegating AccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) в java.lang.reflect.Method.invoke(Method.java:597) в org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection или AopUfeser.aop.framework.:110) в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) в org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDoxy.jpg)..evictAllSecondLevelCacheEntries(Неизвестный источник) в com.rbccm.gelp.server.SystemGwtServiceImpl.evictAllSecondLevelCacheEntries(SystemGwtServiceImpl.java:132) в sun.reflect.NativeMempl t.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:39) в sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) в java.lang.reflect.Mke.g.jj.tjj.jtj.injj.injj.jp..user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:561)

Это указывает на то, что getCache (определенный в интерфейсе) на самом деле не реализован в объекте, который подключается к EntityManagerFactory. Итак, я поместил точку останова в setEntityManagerFactory (emity EntityManagerFactory) и заметил, что конкретный тип объекта на самом деле: org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean

Просматривая исходный код этого класса, я могу подтвердить, что getCache() здесь не реализован. Я считаю, что я использую правильные / совместимые версии:

  • Hibernate 3.6.10
  • Весна 3.1.1
  • JPA 2.0

Кто-нибудь сталкивался с подобными проблемами или способен воспроизвести эту проблему? Как мне это решить? Если нет, то какова альтернатива для удаления всех элементов кэша из cahce второго уровня?

1 ответ

Решение

Hibernate имеет другую реализацию кеша. В файле свойств hibernate используйте свойство hibernate.cache.provider_class, чтобы установить конкретный класс кэша.

Другие вопросы по тегам