2

JPQL クエリを実行し、その結果を取得するとします。

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

さらに、JTA トランザクションにいるとします。

この時点で、JPA 仕様に従ってGreeble、返されたすべてのエンティティListが管理されます (永続化コンテキストで追跡されます)。

たまたま、永続化コンテキストでそれらを追跡したくありません。もしそうなら膨大な量のオーバーヘッドがあり、私のチームメンバーの何人かがうっかりしてさまざまなGreebles の setter を呼び出し、それによってs がデータベースに行くべきではないときにUPDATEデータベースに行くことになります。EntityManager#flush()

追跡/管理する必要clear()があるさまざまなエンティティがそこにあるため、永続化コンテキストは必要ありません。

私は次のことを行うことについて漠然とした不快な気持ちを持っていますが、それが唯一の方法のようです:

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

さて、私が漠然とした不快な気持ちを抱いている理由は、JPAプロバイダーが実際に完全なクエリ結果リストをロードすることを避けるためにあらゆる種類のトリックを持っている可能性があり、このリスト全体をトラバースするとそのようなトリック。多分これは根拠のない懸念です。いずれにせよ、エンティティを 1 つずつ分離するタイトなループでここに座っているのは嫌です。おそらく私はそうすべきではありません。

EntityManager無数のエンティティを/persistence コンテキストから効率的に切り離すために見落とした他の方法はありますか?

4

1 に答える 1