这可能是一个基本的问题,但在网络上找不到答案。
我正在尝试使用二级缓存(使用ehcache),并且每次尝试加载一些对象时,我都会检查是否从数据库中检索到它们,唯一的区别是我不是通过id来获取它们,而是通过一个带有SEO友好名称的属性来获取它们,这些名称用于在我工作的系统上创建urls。jpa/hibernate是否能够仅通过obj的id从缓存中检索对象?有没有办法让它在不需要激活查询缓存的情况下工作?
发布于 2010-10-25 08:12:01
jpa/hibernate是否能够仅通过obj的id从缓存中检索对象?
是的,二级缓存适用于基于Id的查询,即在使用EntityManager.find()或EntityManager.getReference() (或Hibernate API中的等效Session#get()和Session#load() )时查找单个对象。AFAIK,这适用于所有JPA实现。
有没有办法让它在不需要激活查询缓存的情况下工作?
对于标准JPA,除了使用查询缓存之外,我看不到任何其他选择。
但是如果你不介意使用Hibernate API,Query#iterate()可能会有另一种选择。使用Query#iterate(),Hibernate将发出一个只获取ID的SQL查询,当您迭代结果时,它将从缓存中加载相应的实体。
显然,如果不使用二级缓存,Query#iterate()将比Query#list()慢得多。
就我个人而言,我会使用查询缓存。
另请参阅
https://stackoverflow.com/questions/4010986
复制相似问题