Java 为什么我的二级缓存实现出现错误?

Java 为什么我的二级缓存实现出现错误?,java,hibernate,Java,Hibernate,我试图在我的应用程序上实现二级缓存,但它返回以下错误。我对setCacheMode有怀疑 Hibernate.cfg.xml ... <property name="cache.provider_class"> org.hibernate.cache.EhCacheProvider </property> <property name="hibernate.cache.use_query_cache">true</

我试图在我的应用程序上实现二级缓存,但它返回以下错误。我对setCacheMode有怀疑

Hibernate.cfg.xml

 ...
  <property name="cache.provider_class">
            org.hibernate.cache.EhCacheProvider
  </property>

  <property name="hibernate.cache.use_query_cache">true</property>
 ...
 private static SessionFactory configureSessionFactory() {
        try {
            Configuration configuration = new Configuration();
            configuration.configure();
            serviceRegistry = new 
                     ServiceRegistryBuilder()
                    .applySettings(configuration.getProperties())
                    .buildServiceRegistry();

            sessionFactory = configuration.buildSessionFactory(serviceRegistry);

            return sessionFactory;
        } catch (HibernateException e) {
            System.out.append("** Exception in SessionFactory **");
            e.printStackTrace();
        }
       return sessionFactory;
  }
Model.Java

public class Product implements Serializable {
...
    @Id
    @GeneratedValue
    @Column(name = "id")
    @Cache(usage= CacheConcurrencyStrategy.READ_ONLY)
    public long getID() {
        return ID;
    }
...
}
....
final Session session = HibernateUtil.getSession();
        try {
            final Transaction tx = session.beginTransaction();
            try {
                Product product = (Product) session.get(Product.class, id);
                session.setCacheMode(CacheMode.NORMAL);
                tx.commit();
                return product;
            } catch (Exception e) {
                tx.rollback();
                e.printStackTrace();
            }
        } finally {
            HibernateUtil.closeSession();
        }
.....
错误

INFO: ** Exception in SessionFactory **
SEVERE: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.spi.CacheImplementor]
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:186)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:150)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:131)
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:264)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1760)
    at com.my.util.HibernateUtil.configureSessionFactory(HibernateUtil.java:26)
    at com.my.util.HibernateUtil.<clinit>(HibernateUtil.java:43)
    at com.my.controller.Default.execute(Default.java:29)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:446)
    at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:285)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:256)
    at 
    .....

如果您使用的hibernate版本高于3.3,则需要使用此属性

<property name="hibernate.cache.region.factory_class">
        org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory
   </property>

org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory
并为maven添加依赖性

<dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-ehcache</artifactId>
        <version>${hibernate-core.version}</version>
    </dependency>

org.hibernate
休眠ehcache
${hibernate core.version}
然后你用 Product=(Product)session.get(Product.class,id);
这将是二级缓存(如果会话关闭),而不是查询。

您的hbm配置缺少二级缓存使用的重要部分。请添加
hibernate.cache。使用第二级\u cache
hibernate.cache.region.factory\u class
选项。请参阅您的hibernate版本的hbm手册,以了解factory的正确类值。

如果您使用的hibernate版本高于3.3,则需要使用以下属性:

<property name="hibernate.cache.region.factory_class">
     org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory
</property>
这将是二级缓存(如果会话已关闭),而不是查询

您还需要覆盖
buildsessionFactory
。 检查在以前版本的hibernate中使用的方法。 然后检查更高版本使用的是什么——该方法只需重写即可


现在我重写了
buildsessionfactory
方法,因为我使用的是hibernate4.3.11-final。

不知道这是否能解决您的问题。添加以下属性以启用二级缓存。true@Sanj“我已经添加了这一点,但在使用它后仍会遇到相同的错误应用程序遇到此错误”java.lang.reflect.InvocationTargetException sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)java.lang.reflect.Method.invoke(Method.java:601)com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:446)“谢谢!它对我有用。(我正在使用Hibernate 4.2.0.Final)。我还阅读了本文的说明:(但是,它没有提到需要添加
SingleToneCacheRegionFactory
——我想它有点过时了(从2012年开始))
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-ehcache</artifactId>
    <version>${hibernate-core.version}</version>
</dependency>
Product product = (Product) session.get(Product.class, id);