Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在给定多个实体ID的情况下,对其进行高效的缓存感知抓取_Java_Mysql_Hibernate_Jpa_Jpa 2.0 - Fatal编程技术网

Java 在给定多个实体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

这是在Hibernate上运行的JPA2

我想检索同一实体类型的多个实例,给定它们的ID。其中许多已经在持久性上下文和/或二级缓存中

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

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

在不选择加载效率低还是加载太多的情况下,最好的方法是什么?

您应该*能够像这样推测地从会话缓存中拉出实体:

T obj = entityManager.getReference(entityClass, id);
boolean inSessionCache = entityManager.getEntityManagerFactory().isLoaded(obj);
我承认,这仍然给你留下了一个相当糟糕的解决方案

(*可能)