假设我运行一个 JPQL 查询并得到它的结果:
final Iterable<? extends Greeble> greebles = someTypedJPQLQueryReturningZillionsOfGreebleEntities.getResultList();
assert greebles != null;
进一步假设我在 JTA 交易中。
此时,根据 JPA 规范,Greeble
返回的所有实体List
都将被管理(在持久化上下文中进行跟踪)。
碰巧的是,我不希望它们在持久性上下文中被跟踪。我发现如果是这样的话,会有大量的开销,而且我的各个团队成员会无意中调用各种Greeble
s 上的 setter,从而导致UPDATE
s 在真正不应该访问数据库的EntityManager#flush()
时候访问数据库。
我不想clear()
持久化上下文,因为那里有各种应该被跟踪/管理的实体。
我对执行以下操作有一种模糊的不确定的讨厌感觉,但似乎这是唯一的方法:
for (final Greeble greeble : greebles) {
if (greeble != null) {
entityManager.detach(greeble);
}
}
现在,我有一种模糊的、不确定的讨厌感觉的原因是,在我看来,JPA 提供者可能有各种诡计来避免实际加载完整的查询结果列表,并且整个遍历这个列表可能会打败这样的技巧。也许这是一个没有根据的担忧。无论如何,我都不愿意坐在这里,一个个地分开实体。也许我不应该。
有没有其他我忽略的方法可以有效地将数以万计的实体从EntityManager
/persistence 上下文中分离出来?