我有Spring数据JPA(hibernate backend)存储库类的Spring Boot应用程序。我添加了一些自定义查找方法,其中一些用特定的@Query
注释来告诉它如何获取数据。我已经为hibernate二级缓存设置了EhCache,但到目前为止,我能够获得这些结果缓存的唯一方法是启用hibernate查询缓存。我宁愿定义一个特定的缓存并将实际的域对象存储在那里,就好像它是一个普通的查找器。下面是我的回购代码:如何在不使用查询缓存的情况下缓存Spring Data JPA查询方法的结果?
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
,那么这些数据会被缓存到那里,而hibernate不会执行查询。但是,当我禁用查询缓存时,这不会被缓存。我在这里做错了什么?请帮忙!
为什么'@Cache'注解对非实体做任何事情?该注释的意思是不在任何类或接口上的实体。 – 2014-10-07 18:50:23
我想弄清楚...所以任何帮助将不胜感激。 Spring的运行时创建的PagingAndSortingRepository中指定的另一个find ...方法使用JPA/Hibernate的二级缓存提供缓存。这工作正常。但是我创建的这个查找方法,我无法弄清楚如何让IT缓存...... – 2014-10-07 19:05:08
我怀疑'findAll'是否缓存,除非你在你的实体上存放了注释(这是他们应该去的地方)。如果您尝试(或期待)要缓存的非缓存实体,则它将无法工作,只有查询缓存将在此情况下起作用。 – 2014-10-08 05:29:56