Как настроить JPA 2.0 с Hibernate 3.5.2 для использования EHCache в качестве кэша уровня 2 и кэша запросов?

Я нашел несколько инструкций, как настроить чистый Hibernate для использования EHCache. Но я не могу найти какие-либо инструкции, как настроить JPA2.0 EntityManager для использования кэша. Hibernate 3.5.2 - мой провайдер JPA2.0.

редактировать // Есть @Cacheable(true) достаточно для сущности? Или я должен использовать @org.hibernate.annotations.Cache настроить сущность?

2 ответа

Решение

Я нашел несколько инструкций, как настроить чистый Hibernate для использования EHCache. Но я не могу найти какие-либо инструкции, как настроить JPA2.0 EntityManager для использования кэша. Hibernate 3.5.2 - мой провайдер JPA2.0.

Способ, которым вы конфигурируете провайдер кэша L2 с помощью JPA, аналогичен необработанному Hibernate.

По умолчанию Hibernate 3.5 поставляется с EhCache 1.5 (см. " Настройка Ehcache в качестве кэша второго уровня"), и если вы хотите использовать официальный поставщик кэша, предоставляемый Hibernate (в hibernate-ehcache если вы используете Maven), объявите:

<!-- This is the provider for Ehcache provided by Hibernate, using the "old" SPI -->
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider"/>

Если вы хотите использовать EhCache 2.x, вам нужно использовать поставщика, предоставляемого EhCache, который поддерживает новый SPI Hibernate 3.3 / 3.5 с его CacheRegionFactory). Использование:

<!-- The region factory property is the "new" property (for Hibernate 3.3 and above) -->
<property name="hibernate.cache.region.factory_class" value="net.sf.ehcache.hibernate.EhCacheRegionFactory">

например, создание или

<property name="hibernate.cache.region.factory_class" value="net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory"/>

заставить Hibernate использовать синглтон Ehcache CacheManager.

А затем активируйте кеширование L2 и кеширование запросов:

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

Это для настройки кэша Hibernate L2.

Достаточно ли @Cacheable(true) для сущности? Или я должен использовать @org.hibernate.annotations.Cache для настройки объекта?

В теории @Cacheable предполагается, что является заменой для фирменной аннотации Hibernate, и должен использоваться вместе с shared-cache-mode элемент:

<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0">
  <persistence-unit name="FooPu" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    ...
    <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
    <properties>
      ...
    </properties>
  </persistence-unit>
</persistence>

Но, как уже упоминалось в предыдущем вопросе, первоначальные эксперименты не увенчались успехом (это может быть связано с HHH-5303, я не могу сказать, что я не слишком много исследовал). Поэтому я предлагаю придерживаться фирменных аннотаций.

Рекомендации

  • Справочное руководство по Hibernate EntityManager
  • JPA 2.0 Спецификация
    • Раздел 3.7.1 "Элемент режима общего кэша"
    • Раздел 11.1.7 "Кэшируемая аннотация"

Ресурсы

Связанный вопрос

В файле persistence.xml вы можете указать это свойство:

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

и сделать его активным:

<property name="hibernate.cache.use_second_level_cache" value="true" />
Другие вопросы по тегам