JPQL クエリを実行し、その結果を取得するとします。
final Iterable<? extends Greeble> greebles = someTypedJPQLQueryReturningZillionsOfGreebleEntities.getResultList();
assert greebles != null;
さらに、JTA トランザクションにいるとします。
この時点で、JPA 仕様に従ってGreeble
、返されたすべてのエンティティList
が管理されます (永続化コンテキストで追跡されます)。
たまたま、永続化コンテキストでそれらを追跡したくありません。もしそうなら膨大な量のオーバーヘッドがあり、私のチームメンバーの何人かがうっかりしてさまざまなGreeble
s の setter を呼び出し、それによってs がデータベースに行くべきではないときにUPDATE
データベースに行くことになります。EntityManager#flush()
追跡/管理する必要clear()
があるさまざまなエンティティがそこにあるため、永続化コンテキストは必要ありません。
私は次のことを行うことについて漠然とした不快な気持ちを持っていますが、それが唯一の方法のようです:
for (final Greeble greeble : greebles) {
if (greeble != null) {
entityManager.detach(greeble);
}
}
さて、私が漠然とした不快な気持ちを抱いている理由は、JPAプロバイダーが実際に完全なクエリ結果リストをロードすることを避けるためにあらゆる種類のトリックを持っている可能性があり、このリスト全体をトラバースするとそのようなトリック。多分これは根拠のない懸念です。いずれにせよ、エンティティを 1 つずつ分離するタイトなループでここに座っているのは嫌です。おそらく私はそうすべきではありません。
EntityManager
無数のエンティティを/persistence コンテキストから効率的に切り離すために見落とした他の方法はありますか?