2

假设我运行一个 JPQL 查询并得到它的结果:

final Iterable<? extends Greeble> greebles = someTypedJPQLQueryReturningZillionsOfGreebleEntities.getResultList();
assert greebles != null;

进一步假设我在 JTA 交易中。

此时,根据 JPA 规范,Greeble返回的所有实体List都将被管理(在持久化上下文中进行跟踪)。

碰巧的是,我不希望它们在持久性上下文中被跟踪。我发现如果是这样的话,会有大量的开销,而且我的各个团队成员会无意中调用各种Greebles 上的 setter,从而导致UPDATEs 在真正不应该访问数据库的EntityManager#flush()时候访问数据库。

我不想clear()持久化上下文,因为那里有各种应该被跟踪/管理的实体。

我对执行以下操作有一种模糊的不确定的讨厌感觉,但似乎这是唯一的方法:

for (final Greeble greeble : greebles) {
  if (greeble != null) {
    entityManager.detach(greeble);
  }
}

现在,我有一种模糊的、不确定的讨厌感觉的原因是,在我看来,JPA 提供者可能有各种诡计来避免实际加载完整的查询结果列表,并且整个遍历这个列表可能会打败这样的技巧。也许这是一个没有根据的担忧。无论如何,我都不愿意坐在这里,一个个地分开实体。也许我不应该。

有没有其他我忽略的方法可以有效地将数以万计的实体从EntityManager/persistence 上下文中分离出来?

4

1 回答 1

0

也许您可以使用“JPA 构造函数查询”来创建自定义类(非 JPA 管理),但仍然传递您的实体类。

不过还没有尝试过,也许你的 EM 会尖叫,因为你的“自定义”类恰好是一个实体 - 或者只是让实例管理。

所以在你的情况下,kinduv 喜欢:

List<? extends Greeble> = em.createQuery("SELECT NEW com.acme.GreebleSubClass(g.id, g.name)
    FROM Greeble g").getResultList();
  • 您必须创建一个匹配的构造函数
  • 当然,自己处理可能的实体关系

兄弟,延斯

于 2013-11-15T09:21:08.387 回答