Java 在给定多个实体ID的情况下,对其进行高效的缓存感知抓取
这是在Hibernate上运行的JPA2 我想检索同一实体类型的多个实例,给定它们的ID。其中许多已经在持久性上下文和/或二级缓存中 我尝试了几种方法,但似乎都有其缺点:Java 在给定多个实体ID的情况下,对其进行高效的缓存感知抓取,java,mysql,hibernate,jpa,jpa-2.0,Java,Mysql,Hibernate,Jpa,Jpa 2.0,这是在Hibernate上运行的JPA2 我想检索同一实体类型的多个实例,给定它们的ID。其中许多已经在持久性上下文和/或二级缓存中 我尝试了几种方法,但似乎都有其缺点: 当我使用entityManager.find(id)在id上迭代时,每个非缓存项都会得到一个查询,即查询太多 查询形式为selecte FROM MyEntity e,其中e.id在(:ids)中,缓存的条目将从数据库中重新加载 我可以使用entityManager.getEntityManagerFactory().get
- 当我使用
在id上迭代时,每个非缓存项都会得到一个查询,即查询太多entityManager.find(id)
- 查询形式为
中,缓存的条目将从数据库中重新加载selecte FROM MyEntity e,其中e.id在(:ids)
- 我可以使用
事先手动检查每个id的缓存。这适用于二级缓存,但对于持久性上下文中的条目(但不在二级缓存中)将返回falseentityManager.getEntityManagerFactory().getCache().contains(id)
在不选择加载效率低还是加载太多的情况下,最好的方法是什么?您应该*能够像这样推测地从会话缓存中拉出实体:
T obj = entityManager.getReference(entityClass, id);
boolean inSessionCache = entityManager.getEntityManagerFactory().isLoaded(obj);
我承认,这仍然给你留下了一个相当糟糕的解决方案
(*可能)