如何分离()JPA管理实体的集合?

时间:2013-11-14 18:48:43

标签: jpa

假设我运行了一个JPQL查询并获得了结果:

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

假设我正在进行JTA交易。

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

碰巧,我不希望在持久化上下文中跟踪它们。我发现如果它们有大量的开销,我的团队成员会不经意地在各种Greeble上调用setter,从而导致UPDATE进入数据库EntityManager#flush()时间真的没有。

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

关于做以下事情,我有一种模糊的不确定感,但看起来这是唯一的方法:

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

现在,我有一种模糊不确定的讨厌感觉的原因是,在我看来,JPA提供商可能会有各种各样的技巧,以避免实际加载完整的查询结果列表,并完整地遍历此列表可能会打败这些伎俩。也许这是毫无根据的担忧。无论如何,我不愿意坐在这里一个接一个地拆开实体的紧密循环。也许我不应该。

我是否有其他方法忽略了从EntityManager /持久化背景中有效地分离数以万计的实体?

1 个答案:

答案 0 :(得分:0)

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

虽然没有尝试过,也许你的EM会尖叫,因为你的“自定义”类碰巧是一个实体 - 或者只是简单地管理实例。

所以在你的情况下,有点像:

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

BR, 延