Я пытаюсь вырезать кеш второго уровня в моем менеджере сущности настойчивости. Похоже, что я могу использовать следующую функцию, определенную в интерфейсе 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
Кто-нибудь сталкивался ни в подобных вопросах или в состоянии воспроизвести эту проблему? Как я могу это ответить? Если нет, то какова альтернатива выселению всех элементов кеша из кэша второго уровня?
Вы бы посоветовали, как контролировать, если объект кэширован? – Scarlett
http://docs.oracle.com/javaee/6/api/javax/persistence/Cache.html – Fireworks