Попытка выселить кеш второго уровня
Я пытаюсь удалить кэш второго уровня в моем диспетчере сущностей персистентности. Похоже, я могу использовать следующую функцию, определенную в интерфейсе 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, чтобы установить конкретный класс кэша.