在给定ID的情况下,多个实体的高效缓存感知提取

时间:2013-07-08 21:20:47

标签: java mysql hibernate jpa jpa-2.0

这是在Hibernate上运行的JPA2。

我希望在给定ID的情况下检索同一实体类型的多个实例。其中许多已经存在于持久化上下文和/或二级缓存中。

我尝试了几种方法,但似乎都有它们的缺点:

  • 当我使用entityManager.find(id)迭代id时,我会为每个非缓存项找到一个查询,即查询太多。
  • 使用SELECT e FROM MyEntity e WHERE e.id in (:ids)形式的查询,将从数据库重新加载缓存的条目。
  • 我可以使用entityManager.getEntityManagerFactory().getCache().contains(id)预先为每个ID手动检查缓存。这适用于二级缓存,但对于持久性上下文中的条目将返回false,但不会在二级缓存中返回。

在没有选择加载效率低和加载过多的情况下,最好的方法是什么?

1 个答案:

答案 0 :(得分:0)

您应该*能够推测性地将实体拉出会话缓存,如下所示:

T obj = entityManager.getReference(entityClass, id);
boolean inSessionCache = entityManager.getEntityManagerFactory().isLoaded(obj);

我承认,这仍然会给你一个非常重要的解决方案。

(*可能)