Как настроить JPA 2.0 с Hibernate 3.5.2 для использования EHCache в качестве кэша уровня 2 и кэша запросов? - PullRequest
16 голосов
/ 09 сентября 2010

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

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

Ответы [ 2 ]

30 голосов
/ 09 сентября 2010

Я нашел несколько инструкций, как настроить чистый 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, который поддерживает новый Hibernate 3.3 / 3.5 SPI с 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 «Кэшируемая аннотация»

Ресурсы

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

3 голосов
/ 09 сентября 2010

в файле 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" />
...