JPA / HIBERNATE - 对象实例是否仅通过id缓存索引?

时间:2010-10-24 23:21:30

标签: hibernate orm jpa ehcache second-level-cache

可能这是一个基本问题,但无法在网络的任何地方找到答案。

我正在尝试使用二级缓存(使用ehcache)并且每次我尝试加载时都检查了从数据库中检索到的某些对象,唯一的区别是我没有通过id获取它们但是通过带有SEO友好名称的属性,用于在我正在使用的系统上创建URL。是不是jpa / hibernate能够通过obj的id从缓存中检索对象?有没有办法让它工作而不需要激活查询缓存?

1 个答案:

答案 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()慢得多。

就个人而言,我会使用查询缓存。

另见