我有一个包含JPA实体,spring仓库和spring服务的java jar库,现在我将此库包含在项目中,我希望某些实体是可缓存的(缓存在二级缓存中),并且不想更改该库。 / p>
是否可以将 Cachemanager 配置为包含不以@Cacheable
市场名义销售的实体?
答案 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从那里获取查询结果。否则,它将执行查询并将其结果存储在缓存中。