2013-11-19 3 views
5

Я пытаюсь реализовать кэш второго уровня в своем приложении, но он возвращает следующую ошибку. Я подозрительно настроен на setCacheMode.Почему моя реализация кэша второго уровня запущена?

hibernate.cfg.xml

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

    <property name="hibernate.cache.use_query_cache">true</property> 
... 

Product.Java

public class Product implements Serializable { 
... 
    @Id 
    @GeneratedValue 
    @Column(name = "id") 
    @Cache(usage= CacheConcurrencyStrategy.READ_ONLY) 
    public long getID() { 
     return ID; 
    } 
... 
} 

Model.Java

.... 
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 
    ..... 

Util

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; 
    } 
+0

Не знаете, решит ли это вашу проблему. Добавьте свойство ниже, чтобы включить кеш второго уровня. <свойство name = "hibernate.cache.use_second_level_cache"> true – Sanj

+0

@Sanj 've добавил это, но все еще сталкивается с той же ошибкой – J888

ответ

5

При использовании спящего режима версии выше, чем 3.3, вы должны использовать эти свойства

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

и добавьте Зависимость от к Maven

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

, а затем вы используете Продукт продукта = (Product) session.get (Product.class, id); Это будет кеш второго уровня (если сеанс близок), а не запрос.

+0

После того, как я использовал приложение, это столкнулось с этой ошибкой «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) " – J888

+0

Спасибо, это работает для меня (я использую Hibernate 4.2.0.Final). также прочитайте инструкцию по этой статье: https://www.javacodegeeks.com/2012/02/hibernate-cache-levels-tutorial.html (которая, однако, не упоминает о необходимости добавления «SingletonEhCacheRegionFactory» - я думаю он немного устарел (с 2012 года)) – leeyuiwah

+0

спасибо, что это сработало для меня – dom

0

В вашей конфигурации hbm отсутствуют важные части для использования кеша второго уровня. Пожалуйста, добавьте hibernate.cache.use_second_level_cache и hibernate.cache.region.factory_class вариантов. DO обратитесь к руководству hbm для вашей версии спящего режима для получения правильных значений класса для завода.

-1

При использовании спящего режима версии выше, чем 3.3, вы должны использовать это свойство:

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

и добавить зависимость в Maven:

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

, а затем использовать:

Product product = (Product) session.get(Product.class, id); 

Это будет кеш второго уровня (если сеанс закрыт), а не запрос.

Также вам необходимо переопределить buildsessionFactory. Проверьте, какие методы вы используете в предыдущих версиях спящего режима. Затем проверьте, что используется более высокая версия, - этот метод нужно только переопределить.

Теперь я переопределяю метод buildsessionfactory, потому что я использую hibernate4.3.11-final.

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