0

POST する jax-rs REST サービスがあります。

ArrayList<Book>

オブジェクトをサーバーに送信します。

サーバーでは、各 Book をループ処理し、BookEntity (私は JPA を使用しています) に変換してから、各 Book を永続化します。

BookEntity の永続化に失敗した場合は、POST 操作全体が失敗し、送信された ArrayList 内の Book Entities が永続化されないようにしたいと考えています。操作全体をロールバックして、すべてかゼロかにしたいと考えています。

Container Managed Transactions (Entity Manager を注入するだけで無料で入手できると理解しています) を使用するだけでうまくいきますか? それとも、これを行うには JTA が必要ですか? トランザクション管理のどの部分が自動的に行われるのか、少し混乱していますか?

ありがとうございました!

4

1 に答える 1

1

エンティティ マネージャーを注入するだけでは、コンテナー管理のトランザクションは得られません。サービスの CMT を有効にするための前提条件は次のとおりです。

  1. サービスは EJB でなければなりません (@Stateless、@Stateful、@MessageDriven)
  2. サービスは を定義する必要があります@TransactionManagement(CONTAINER)。これがデフォルトであるため、注釈全体を省略できます
  3. サービスは、その JPA 操作に JTA エンティティ マネージャーを使用する必要があります。

すべての前提条件が満たされている場合、サービスの特定のビジネス メソッドについて、コンテナーはそのトランザクションを自動的に管理します。トランザクションの動作は、アノテーションを使用してメソッドごとに微調整できますTransactionAttributeが、デフォルトは各メソッドの場合です。

  • トランザクションが存在しない場合は、トランザクションを開始します
  • メソッドが完了したら、トランザクションをコミットします
  • メソッドによって例外がスローされた場合、トランザクションをロールバックします
于 2013-02-23T08:06:21.637 に答える