1

私のアプリケーションでは、切り離されたモードでフェッチされたほとんどのオブジェクトが必要です (find API でフェッチされます)。
JPA プロバイダーから切り離されたオブジェクトを要求し、detach() API への余分な呼び出しを保存する方法があるかどうか疑問に思っています。
さらに、このようなモードで作成されたオブジェクトは、JPA プロバイダーがエンティティーマネージャーのコンテキストに追加する必要がないため、コストが低くなると思います。
JPA APIでこれを達成する方法はありますか?
クエリ結果でそのような機能を実現する方法はありますか?

  • 特に私はEclipse Linkを使用しているので、この実装でそれを行う特定の方法があればそれも役に立ちます。
4

1 に答える 1

2

detach()トランザクションの外部でエンティティを取得する場合は、追加の呼び出しなしで分離されたエンティティを取得できます。コンテナ管理のトランザクションを使用していない場合、それは些細なことです。単にトランザクションを開始しないでください。

CMT を使用している場合は、要求しているオブジェクトがトランザクション対応の EJB でないことを確認する必要があります。

  • EJB の場合は、適切なメソッドに次のアノテーションを付けてトランザクションを一時停止します@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)

また

  • EntityManagerPOJO から呼び出します。直接呼び出す必要はありません。クエリの結果が非 EJB オブジェクトで終了することだけが重要です。

私の知る限り、クエリ結果は常に現在の永続化コンテキストに置かれるため、期待されるパフォーマンスの向上はありませんが、それは短命かもしれません。

編集:トランザクション境界に依存しない切り離されたオブジェクトを取得する別の可能性があります: JPA コンストラクター式:

List<DTO> dtos = em.createQuery("SELECT NEW com.example.DTO( o.title, o.version) FROM Entity o").getResultList();

構築された型には、関連するすべての属性を持つコンストラクターが必要です。リスト内のオブジェクトは、エンティティであろうとなかろうと、常に切り離されて作成されます。ただし、新しいオブジェクトをインスタンス化するためのわずかなオーバーヘッドがあります。

于 2013-02-14T12:50:58.043 に答える