2013-12-20 2 views
1

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

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

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

Caused by: java.lang.AbstractMethodError: org.hibernate.ejb.EntityManagerFactoryImpl.getCache()Ljavax/persistence/Cache; at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.invokeProxyMethod(AbstractEntityManagerFactoryBean.java:376) at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean$ManagedEntityManagerFactoryInvocationHandler.invoke(AbstractEntityManagerFactoryBean.java:517) at com.sun.proxy.$Proxy26.getCache(Unknown Source) at com.rbccm.gelp.server.util.PersistenceManager.getCache(PersistenceManager.java:30) at com.rbccm.gelp.server.service.SystemDataServiceImpl.evictAllSecondLevelCacheEntries(SystemDataServiceImpl.java:133) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) at com.sun.proxy.$Proxy34.evictAllSecondLevelCacheEntries(Unknown Source) at com.rbccm.gelp.server.SystemGwtServiceImpl.evictAllSecondLevelCacheEntries(SystemGwtServiceImpl.java:132) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:561)

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

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

  • Hibernate 3.6.10
  • Spring 3.1.1
  • JPA 2,0

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

ответ

1

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

+0

Вы бы посоветовали, как контролировать, если объект кэширован? – Scarlett

+0

http://docs.oracle.com/javaee/6/api/javax/persistence/Cache.html – Fireworks

Смежные вопросы