1

我正在尝试驱逐持久性实体管理器中的二级缓存。看起来我可以使用 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) at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.invokeProxyMethod(AbstractEntityManagerFactoryBean.java:376) at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean$ManagedEntityManagerFactoryInvocationHandler.invoke(AbstractEntityManagerFactoryBean.java:517) com.sun.proxy.$Proxy26.getCache(Unknown Source) at com.rbccm.gelp.server.util.PersistenceManager.getCache(PersistenceManager.

这向我表明 getCache(在接口中定义)实际上并未在连接到 EntityManagerFactory 的对象中实现。所以,我在 setEntityManagerFactory(EntityManagerFactory emf) 中放了一个断点,我注意到对象的具体类型实际上是:org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean

当我浏览这个类的源代码时,可以确认这里没有实现getCache()。我相信我使用的是正确/兼容的版本:

  • 休眠 3.6.10
  • 春天 3.1.1
  • JPA 2.0

有没有人遇到过类似的问题或者能够重现这个问题?我该如何解决这个问题?如果不是,那么从二级缓存中驱逐所有缓存项的替代方法是什么?

4

1 回答 1

1

hibernate有不同的缓存实现。在 hibernate 属性文件中使用属性 hibernate.cache.provider_class 来设置具体的缓存类。

于 2013-12-20T09:24:01.050 回答