2

Spring Transactions を理解するのに苦労しています。まず、Spring をできるだけ使わないようにしています。基本的に、JPA/Hibernate で @Transactional とその注入機能の一部を使用したいと考えています。私のトランザクションの使用は、私のサービス層にあります。私はそれらをテストケースに入れないようにしています。私はCTWを使用しており、スプリング構成です。現在、パッケージのルートでコンポーネント スキャンを実行しています。データソース、JpaTransactionManager、および EntityManagerFactory にも Java 構成を使用しています。JpaTransactionFactory の構成は次を使用します。

        AnnotationTransactionAspect.aspectOf().setTransactionManager( txnMgr );

@EnableTransactionManagement は使用しません。

残念ながら、私は @Transactional のルールを理解するのに苦労しており、それらを簡単に説明する簡単なページを見つけることができません。特にセッションの使用に関して。たとえば、デフォルトの引数なしコンストラクターを持たないクラスで @Transactional を使用したい場合はどうすればよいでしょうか?

私が抱えている最も奇妙な問題は、一部の POJO サービス クラスでは Transacitonal がうまく機能する一方で、他のクラスではトランザクションが作成されているのを確認できますが、操作は最終的に「セッションがないか、セッションが閉じられました」と言って落ちることです。これを再現するためのコードがないことをお詫びします。小さなセットにはできません。これが、私が自分でそれを理解できるように、最高のリソースを探している理由です.

たとえば、遅延フェッチされた子のコレクションを取得し、それを反復処理して Set に入れ、そのセットを返すメソッドを作成できます。あるクラスでは問題なく動作しますが、@Transactional でマークされた別のクラスでは、PersistentSet を反復しようとして失敗し、セッションが存在しないと言って失敗します (トランザクションはあります)。

これは、テスト ケースでこれらのサービス オブジェクトの両方を作成し、最初のオブジェクトが何らかの形でセッションをハイジャックしているためでしょうか?

ちなみに、スプリングソースの取引書類は一通り読んだ。このような問題をデバッグするための明確なルールとヒントを探しています。ありがとう。

4

1 に答える 1

1

怠惰な子をロードしようとしているまさにそのトランザクションのスコープで、親エンティティをロードしたことは確かですか? たとえば、パラメーターとして渡された場合 (つまり、@Transactionalメソッドの外部からロードされた場合)、永続化コンテキストにバインドされない可能性があります...

@Transactionalコンテキストが指定されていない場合、データベース関連のアクションには短い tx が作成され、すぐに閉じられる可能性があることに注意してください。これにより、後続の遅延読み込み呼び出しが無効になります。これは、永続化コンテキスト自動コミット構成によって異なります。

簡単に言えば、トランザクション コンテキストのない動作は予期しない場合があるため、基本ルールは常にトランザクション コンテキストを持つことです。データベースにアクセスする場合は、明確に定義された tx - 期間を指定します。spring-tx では、すべて@Repositoryの と@Serviceがであることを意味します@Transactional。このようにして、tx 関連の問題のほとんどを回避する必要があります。

于 2013-02-05T13:57:43.673 に答える