detach()
トランザクションの外部でエンティティを取得する場合は、追加の呼び出しなしで分離されたエンティティを取得できます。コンテナ管理のトランザクションを使用していない場合、それは些細なことです。単にトランザクションを開始しないでください。
CMT を使用している場合は、要求しているオブジェクトがトランザクション対応の EJB でないことを確認する必要があります。
- EJB の場合は、適切なメソッドに次のアノテーションを付けてトランザクションを一時停止します
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
。
また
EntityManager
POJO から呼び出します。直接呼び出す必要はありません。クエリの結果が非 EJB オブジェクトで終了することだけが重要です。
私の知る限り、クエリ結果は常に現在の永続化コンテキストに置かれるため、期待されるパフォーマンスの向上はありませんが、それは短命かもしれません。
編集:トランザクション境界に依存しない切り離されたオブジェクトを取得する別の可能性があります: JPA コンストラクター式:
List<DTO> dtos = em.createQuery("SELECT NEW com.example.DTO( o.title, o.version) FROM Entity o").getResultList();
構築された型には、関連するすべての属性を持つコンストラクターが必要です。リスト内のオブジェクトは、エンティティであろうとなかろうと、常に切り離されて作成されます。ただし、新しいオブジェクトをインスタンス化するためのわずかなオーバーヘッドがあります。