【发布时间】:2019-09-26 04:02:30
【问题描述】:
我有带有 JPA 实体、spring 存储库和 spring 服务的 java jar 库,现在我将这个库包含在项目中,我希望一些实体可以缓存(缓存在二级缓存中)并且不想更改库。
是否可以将 Cachemanager 配置为包含不属于 @Cacheable 市场的实体?
【问题讨论】:
标签: java spring hibernate caching spring-data-jpa
我有带有 JPA 实体、spring 存储库和 spring 服务的 java jar 库,现在我将这个库包含在项目中,我希望一些实体可以缓存(缓存在二级缓存中)并且不想更改库。
是否可以将 Cachemanager 配置为包含不属于 @Cacheable 市场的实体?
【问题讨论】:
标签: java spring hibernate caching spring-data-jpa
如果你对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)
【讨论】:
@Cacheable(false) 启用所有并禁用选定的实体,要么使用 @Cacheable(true) 禁用所有并启用选定的实体
如果你想使用Hibernate的独立于会话的二级缓存,它可以被多个HibernateSession使用,你必须先激活它。
先修改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 注释来注释您的实体。
如果您使用共享缓存模式DISABLE SELECTIVE,您还可以使用@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 从那里获取查询结果。否则,它将执行查询并将其结果存储在缓存中。
【讨论】: