假设我运行了一个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
/持久化背景中有效地分离数以万计的实体?
答案 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, 延