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