【发布时间】:2014-12-02 06:18:37
【问题描述】:
我有一个带有 Spring Data JPA(休眠后端)存储库类的 Spring Boot 应用程序。我添加了几个自定义查找器方法,其中一些带有特定的@Query 注释来告诉它如何获取数据。我已经为休眠二级缓存设置了 EhCache,但到目前为止,我可以获得这些结果缓存的唯一方法是启用休眠查询缓存。我更愿意定义一个特定的缓存并将实际的域对象存储在那里,就像它是一个普通的查找器一样。以下是我的回购代码:
public interface PromotionServiceXrefRepository extends PagingAndSortingRepository<PromotionServiceXref, Integer> {
@Query("SELECT psx FROM Customer c " +
"JOIN c.customerProductPromotions cpp " +
"JOIN cpp.productPromotion pp " +
"JOIN pp.promotion p JOIN p.promotionServiceXrefs psx " +
"WHERE c.customerId = ?1")
@QueryHints(@QueryHint(name = "org.hibernate.cacheable", value = "true"))
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY, region = "promotionServiceXrefByCustomerId")
Set<PromotionServiceXref> findByCustomerId(int customerId);
}
这是我定义的“promotionServiceXrefByCustomerId”缓存,没有被使用:
<cache name="promotionServiceXrefByCustomerId" overflowToDisk="true" diskPersistent="true"
maxEntriesLocalHeap="3000000" eternal="true" diskSpoolBufferSizeMB="20" memoryStoreEvictionPolicy="LFU"
transactionalMode="off" statistics="true">
</cache>
我做错了什么?如果我启用StandardQueryCache,那么这些数据会被缓存在那里并且休眠不会执行查询。但是当我禁用查询缓存时,它不会被缓存。我在这里做错了什么?请帮忙!
【问题讨论】:
-
为什么
@Cache注释应该为非实体做任何事情?该注释适用于不在任意类或接口上的实体。 -
我正试图弄清楚...所以任何帮助将不胜感激。由 Spring 在运行时创建的 PagingAndSortingRepository 中指定的其他 find... 方法使用 JPA/Hibernate 的二级缓存提供缓存。这工作正常。但是我创建的这个查找器方法,我不知道如何让 IT 缓存...
-
我怀疑
findAll是否正在缓存,除非您在实体上缓存注释(这是它们应该去的地方)。如果您正在尝试(或期望)缓存不可缓存的实体,它将无法工作,只有查询缓存才能在这种情况下工作。 -
谢谢。这就是我想出来的。我一直在尝试使用实体的休眠二级缓存来缓存自定义查询。我不想使用查询缓存,所以我现在使用 Spring 的缓存抽象,并在这些自定义查找器的服务级别缓存。
标签: java hibernate spring-data ehcache spring-boot