我有带有JPA实体、spring存储库和spring服务的java jar库,现在我在项目中包含了这个库,其中我希望一些实体可以缓存(缓存在二级缓存中),并且不想更改库。
可以将Cachemanager配置为包含非市场实体(如@Cacheable )。
发布于 2019-05-08 12:08:16
如果您对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)
发布于 2019-05-08 12:41:47
如果您想使用Hibernate的与会话无关的二级缓存(可由多个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注释注释实体。
如果使用共享缓存模式( shared模式),还可以使用@Cacheable (false)注释将实体排除在缓存之外。
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将从那里获得查询结果。否则,它将执行查询并将其结果存储在缓存中。
https://stackoverflow.com/questions/56040420
复制相似问题