Если вы хотите использовать независимый от сессии кеш второго уровня, который может использоваться несколькими Hibernate Session
, вы должны сначала активировать его.
Сначала измените persistence.xml
, добавьте:
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
и недвижимость:
<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory"/>
Вы можете выбрать между ALL
для кэширования всех сущностей, NONE
для не кэширования каких-либо сущностей, ENABLE SELECTIVE
для выбора сущностей, которые будут кэшироваться, и DISABLE SELECTIVE
для выбора сущностей, которые не будут кэшироваться , Предпочитайте ENABLE SELECTIVE
, потому что он требует, чтобы вы явно решили, какие объекты кэшируются.
Аннотируйте свою сущность с помощью JPA @Cacheable
или аннотации Hibernate @Cache
.
Вы также можете использовать аннотацию @Cacheable (false)
, чтобы исключить объект из кэширования, если вы используете режим общего кэша DISABLE SELECTIVE
.
Hibernate doesn't use the second-level cache with JPQL or criteria queries.
Если вы хотите использовать кэширование запросов, измените persistence.xml
, поэтому добавьте свойства:
<property name="hibernate.cache.use_query_cache" value="true"/>
<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory"/>
и активировать кеширование для запроса методом setCacheable(boolean b);
(например,):
Session s = (Session) em.getDelegate();
Query q = s.createQuery("SELECT b FROM Book b WHERE id = :id");
q.setParameter("id", 1L);
q.setCacheable(true);
Book b = q.uniqueResult();
Hibernate теперь сохраняет результат этого запроса в кеше запросов. Когда ваш следующий вариант использования выполняет этот запрос, Hibernate проверяет, содержит ли кэш запроса результат для заданных значений параметров. Если кэш содержит соответствующую запись, Hibernate получает оттуда результат запроса. В противном случае он выполняет запрос и сохраняет свой результат в кеше.