可能这是一个基本问题,但无法在网络的任何地方找到答案。
我正在尝试使用二级缓存(使用ehcache)并且每次我尝试加载时都检查了从数据库中检索到的某些对象,唯一的区别是我没有通过id获取它们但是通过带有SEO友好名称的属性,用于在我正在使用的系统上创建URL。是不是jpa / hibernate能够通过obj的id从缓存中检索对象?有没有办法让它工作而不需要激活查询缓存?
答案 0 :(得分:1)
jpa / hibernate是否能够通过obj的id来从缓存中检索对象?
是的,二级缓存适用于基于Id
查找单个对象的查询,即使用EntityManager.find()
或EntityManager.getReference()
(或等效的Session#get()
和{来自Hibernate API的{1}}。 AFAIK,这适用于所有JPA实现。
有没有办法让它工作而不需要激活查询缓存?
使用标准JPA,除了使用查询缓存之外,我没有看到任何其他选项。
但是如果您不介意使用Hibernate API,可能会有Query#iterate()
的替代方案。使用Query#iterate()
,Hibernate将发出一个只获取ID的SQL查询,当您迭代结果时,它将从缓存中加载相应的实体。
显然,如果您没有使用二级缓存,Session#load()
将比Query#iterate()
慢得多。
就个人而言,我会使用查询缓存。