如何将实体标记为可缓存

时间:2019-05-08 12:05:22

标签: java spring hibernate caching spring-data-jpa

我有一个包含JPA实体,spring仓库和spring服务的java jar库,现在我将此库包含在项目中,我希望某些实体是可缓存的(缓存在二级缓存中),并且不想更改该库。 / p>

是否可以将 Cachemanager 配置为包含不以@Cacheable市场名义销售的实体?

2 个答案:

答案 0 :(得分:0)

如果您可以控制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)启用缓存

答案 1 :(得分:0)

如果要使用可由多个Hibernate Session使用的Hibernate独立于会话的二级缓存,则必须首先将其激活。

首先修改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从那里获取查询结果。否则,它将执行查询并将其结果存储在缓存中。