Как настроить 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 "Кэшируемая аннотация"
Ресурсы
- Ehcache 2.0 поддерживает новый поставщик кэширования Hibernate 3.3
- Настройте Ehcache как кэш второго уровня
- Hibernate Кэш второго уровня
Связанный вопрос
В файле 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" />