【发布时间】:2026-01-14 15:25:26
【问题描述】:
我正在尝试清除持久性实体管理器中的二级缓存。看起来我可以使用 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; 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java.lang.reflect.Method.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(Unknown Source) 在 com.rbccm.gelp.server.util.PersistenceManager.getCache(PersistenceManager.java:30) 在 com.rbccm.gelp.server.service.SystemDataServiceImpl.evictAllSecondLevelCacheEntries(SystemDataServiceImpl.java:133) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java.lang.reflect.Method.invoke(Method.java:597) 在 org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) 在 org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 在 org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) 在 com.sun.proxy.$Proxy34.evictAllSecondLevelCacheEntries(未知 来源)在 com.rbccm.gelp.server.SystemGwtServiceImpl.evictAllSecondLevelCacheEntries(SystemGwtServiceImpl.java:132) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java.lang.reflect.Method.invoke(Method.java:597) 在 com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:561)
这向我表明 getCache(在接口中定义)实际上并未在连接到 EntityManagerFactory 的对象中实现。所以,我在 setEntityManagerFactory(EntityManagerFactory emf) 中放了一个断点,我注意到对象的具体类型实际上是:org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean
当我浏览这个类的源代码时,我可以确认这里没有实现getCache()。我相信我使用的是正确/兼容的版本:
- 休眠 3.6.10
- 春季 3.1.1
- JPA 2.0
有没有人遇到过类似的问题或者能够重现这个问题?我该如何解决这个问题?如果不是,那么从二级缓存中驱逐所有缓存项的替代方法是什么?
【问题讨论】:
标签: spring hibernate jpa-2.0 second-level-cache evict