JPA/HIBERNATE-缓存的对象实例是否仅按id编制索引?

JPA/HIBERNATE-缓存的对象实例是否仅按id编制索引?,hibernate,orm,jpa,ehcache,second-level-cache,Hibernate,Orm,Jpa,Ehcache,Second Level Cache,也许这是一个基本问题,但在网络上的任何地方都找不到答案 我尝试使用二级缓存(使用ehcache),并在每次尝试加载时检查是否从数据库中检索了一些对象,唯一的区别是,我不是通过id获取它们,而是通过一个带有SEO友好名称的属性获取它们,该名称用于在我正在工作的系统上创建URL。jpa/hibernate是否能够通过使用obj的id从缓存中检索对象?是否有任何方法可以让它在不需要激活查询缓存的情况下工作 jpa/hibernate是否能够通过使用obj的id从缓存中检索对象 是的,二级缓存用于基于I

也许这是一个基本问题,但在网络上的任何地方都找不到答案

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

jpa/hibernate是否能够通过使用obj的id从缓存中检索对象

是的,二级缓存用于基于
Id
查找单个对象的查询,即使用
EntityManager.find()
EntityManager.getReference()
(或Hibernate API中的等效
Session#get()
Session#load()
)。好吧,这适用于所有JPA实现

是否有任何方法可以让它在不需要激活查询缓存的情况下工作

对于标准JPA,除了使用查询缓存,我看不到任何其他选项

但是,如果您不介意使用HibernateAPI,可能有一种替代方法。使用,Hibernate将发出一个SQL查询,该查询将只获取ID,当您迭代结果时,它将从缓存中加载相应的实体

显然,如果不使用二级缓存,
Query#iterate()
将比
Query#list()
慢得多

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

另见