2

私は、JPAエンティティ(Hibernateを使用)を管理するRESTサービス(Apache-CXFを使用)を提供するアプリケーションを作成しています。

トランザクション管理に少し迷っています。このトピックについてアドバイスをお願いします。

今のところ、トランザクション管理の目的でのみ、ビジネスRESTサービスと下位サービスの間に中間層を配置しました。

現在、私のコードは次のようになっています。

@Service 
class PersistanceService<MyBusinessClass>{
   MyBusinessClass load(Long id);
   void save(MyBusinessClass businessObject);
}

@Service 
class BusinessService<MyBusinessClass>{
   void doSomethingOn(MyBusinessClass businessObject);
}

@Service
class TransactionBusinessService<MyBusinessClass>{
   @Transactional
   void doSomethingOn(Long id) {
      MyBusinessClass businessObject = persistanceService.load(id);
      businessService.doSomethingOn(businessObject);
      persistanceService.save(businessObject);
   }
}

@Service
@path("/foo")
class RESTService {
   @Path("/doSomething")
   void doSomethingOn(Long id) {
      transactionBusinessService.doSomethingOn(id);
   }
}

TransactionBusinessServiceはやり過ぎだと思います。''Spring''または''CXF''でトランザクションを処理したい:リクエストは適切な粒度であると思います:各リクエストの最初にエンティティマネージャーを初期化し、最後に更新をコミットします。

@TransactionalアノテーションをRESTメソッド自体に追加しようとしましたが、無視されているか、CXFと競合しているようです。

  1. トランザクションをリクエストレベルで委任し、もう気にしないのは良い考えだと思いますか?
  2. SpringまたはCXFでトランザクション管理を要求にバインドするにはどうすればよいですか?

アドバイスをよろしくお願いします。

4

1 に答える 1

3

トランザクションをリクエストレベルで委任し、もう気にしないのは良い考えだと思いますか?

通常、それは良い考えではありません。理由は次のとおりです。

  • 通常、トランザクション分離を分離するのはそれほど便利ではありません
  • でいくつかの変更を行う必要がありfor-loop、それぞれに独自のトランザクションが必要な場合も、それほど透過的ではありません。一方、サービスレイヤーでは、ループ全体をトランザクションにする必要があるのか​​、反復ごとにする必要があるのか​​を決定できます。
  • tx:annotation-driven(および他のいくつかのAOPインターセプター)コントローラーでAOPアノテーションを直接使用している場合、少し予測できない動作をすることがあります(少なくとも、Spring MVC / struts2および他のいくつかのフレームワークでこのような問題に直面しました)

つまり、基本的に3つのレイヤーがあります。

  • データの保存/フェッチのみを担当する永続層。
  • データの準備とAOPアノテーション(、、など)を担当するサービスレイヤー@Transactional@PreAuthorize内部@Cacheableで永続レイヤーを使用します。
  • リクエストを取得し、ビジネスモデルをバインドし、おそらくそれを検証し、モデルをサービスレイヤーに渡し、そこから結果を返すか、例外を処理するコントローラーレベル

SpringまたはCXFでトランザクション管理を要求にバインドするにはどうすればよいですか?

次のことを確認してください。

  • 構成に適切なTransactionManager('org.springframework.transaction.PlatformTransactionManager`実装)があります
  • あなたはtx:annotation-drivenあなたの設定にあります
  • これらのBeanは、CXFサービスの構成に表示されます
    <bean name = "txManager" class = "org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name = "sessionFactory" ref = "sessionFactory" />
    </ bean>

    <tx:annotation-driven transaction-manager = "txManager" />
于 2013-03-12T15:19:26.247 に答える