2

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

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

4

1 回答 1

1

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

是的,二级缓存适用于基于Idie 查找单个对象的查询,当使用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()

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

也可以看看

于 2010-10-25T00:12:00.633 回答