Как пометить объекты как кешируемые - PullRequest
0 голосов
/ 08 мая 2019

У меня есть jav-библиотека jar с сущностями JPA, Spring репозиториями и сервисами Spring, и теперь я включил эту библиотеку в проект, где я хочу, чтобы некоторые сущности были кэшируемыми (кэшированными в кеше второго уровня) и не хочу менять библиотеку.

Возможно ли настроить Cachemanager для включения сущностей, которые не продаются как @Cacheable?

Ответы [ 2 ]

0 голосов
/ 08 мая 2019

Если вы хотите использовать независимый от сессии кеш второго уровня, который может использоваться несколькими 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 получает оттуда результат запроса. В противном случае он выполняет запрос и сохраняет свой результат в кеше.

0 голосов
/ 08 мая 2019

Если у вас есть контроль над persistence.xml, вы можете добавить

<shared-cache-mode>ALL</shared-cache-mode>

для единицы сохраняемости для кэширования всех сущностей или

<shared-cache-mode>DISABLE_SELECTIVE</shared-cache-mode>

для включения кэширования для всех сущностей, кроме тех, которые вы пометили как @Cacheable(false) (см. Также https://docs.oracle.com/javaee/7/api/javax/persistence/SharedCacheMode.html)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...