2013-11-11 2 views
4

EDIT: я должен заявить, что я исследовал это в течение нескольких дней в настоящее время - есть много информации о «как настроить EHCache с Hibernate», но в большинстве случаев они не относятся к использованию JPA и аннотаций - они либо относятся к чистым Hibernate, либо к конфигурации через XML. (Просто хочу пояснить, что я уже был в Интернете по этой проблеме.) Я использую JPA и аннотации, поэтому большинство этих руководств по настройке относятся к файлам, которые у меня нет в моем приложении (например, hbm.xml файлы).Кэш второго уровня Ehcache не работает с JPA и Hibernate?

У меня есть приложение, использующее Hibernate 3.6.10.FINAL, Spring Data 1.3.2.RELEASE и Spring версии 3.2.1.RELEASE. Я пытаюсь получить кеширование второго уровня, работающее в спящем режиме. В соответствии с документацией, я могу сделать это, просто включив следующую зависимость и конфигурацию:

(pom.xml)

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

(persistence.xml)

 <property name="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider" /> 
     <property name="hibernate.cache.use_second_level_cache" value="true" /> 
     <property name="hibernate.cache.use_query_cache" value="true" /> 
     <property name="hibernate.generate_statistics" value="true" /> 

Я аннотированный один из моих классов сущностей, используя javax.persistence.Cacheable annotation и попытался просмотреть статистику в тесте JUnit:

public void cacheTest() { 
    RandomDataGenerator randomData = new RandomDataGenerator(); 
    for (int i = 0; i < 10; i++) { 
     AppMaster master = masterService.findOne(randomData.nextLong(1, 10)); 
     logger.debug(String.format("Read one record back = %1$d, %2$s", master.getApplicationId(), master.getApContact()),AppMasterServiceTest.class); 
     // Get statistics from hibernate session 
     Session session = (Session)masterService.getEntityManager().getDelegate(); 
     Statistics statistics = session.getSessionFactory().getStatistics(); 
     logger.debug(String.format("Second level stats = %1$d, %2$d, %3$d", 
       statistics.getSecondLevelCachePutCount(), 
       statistics.getSecondLevelCacheHitCount(), 
       statistics.getSecondLevelCacheMissCount()), AppMasterServiceTest.class); 
    } 

Но статистика всегда равна нулю.

2013-11-11 11:20:33,908 DEBUG [main] test.service.AppMasterServiceTest - Second level stats = 0, 0, 0 

Может ли кто-нибудь помочь мне диагностировать это?

+0

Из того, что вы опубликовали это выглядит, как вы не установили ENABLE_SELECTIVE в ваш persistence.xml. Ознакомьтесь с документами на http://docs.oracle.com/javaee/6/api/javax/persistence/Cacheable.html и посмотрите на этот связанный вопрос http://stackoverflow.com/questions/3663979/how- to-use-jpa2s-cacheable-than-of-hibernates-cache – Planky

+0

Вы, кажется, верны, добавив тег, чтобы явно указать ENABLE_SELECTIVE в файле persistence.xml, похоже, сделал трюк. Я читал, что ENABLE_SELECTIVE должен быть по умолчанию (http://docs.jboss.org/hibernate/entitymanager/3.5/reference/en/html/configuration.html#setup-configuration), однако я также прочитал, что он похоже, не работает именно так. Если вы хотите опубликовать свой комментарий в качестве ответа, я буду рад отметить его правильно! Благодарю. – user1071914

ответ

3

javax.persistence.Cachable требует, чтобы вы установили ENABLE_SELECTIVE в свой файл persistence.xml. Вы должны включить строку следующего:

<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode> 

Выезд Документов на http://docs.oracle.com/javaee/6/api/javax/persistence/Cacheable.html

Кроме того, обратите внимание на этот смежный вопрос: How to use JPA2's @Cacheable instead of Hibernate's @Cache

+0

Чтобы усилить, ENABLE_SELECTIVE должен быть по умолчанию (вам не нужно указывать его явно), но по какой-то причине вы должны поместить эту строку в свой файл persistence.xml или ничего не получите. – user1071914

+0

, но при указании ENABLE_SELECTIVE в разделе в файле persistence.xml будет обнаружена ошибка. cvc-complex-type.2.4.a: Недействительный контент был найден, начиная с элемента 'shared-cache-mode'. "http://java.sun.com/xml/ns/persistence":non-jta-data-source," http://java.sun.com/xml/ns/persistence":mapping-file ", http: // java.sun.com/xml/ns/persistence":jar-file, "http://java.sun.com/xml/ns/persistence":class", http: //java.sun .com/xml/ns/ persistence ": exclude-unlisted-classes," http://java.sun.com/xml/ns/persistence":properties} ". – Scarlett

+0

Спасибо за этот ответ! Это довольно странно, что, например, @ user1071914 говорит, свойство нужно настроить, даже если спящий режим установлен, это значение по умолчанию. – mowwwalker

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