2

ユニットテストケースで作業しているときに、Hibernate の setComplete() メソッドに関する春のドキュメントを読みました。setComplete() とセッションの flush() メソッドの間で混乱しています。どちらも、メモリから実際のデータベースにロードすることにより、データベースでオブジェクトの状態を永続化する責任があります。誰かが私が同じことに関する良いリソース/例を得るのを手伝ってくれるなら、それは素晴らしいことです. 高く評価します。

ありがとう、モーリック

4

1 に答える 1

4

私の知る限り、 Hibernate の API の一部でsetComplete()はありません(何かを参照している場合はリンクを提供してください)。 トランザクションで発生する必要がある JUnit 3.8 ベースのテストAbstractTransactionalSpringContextTestsの便利な基本クラスであるAPI の一部ですが、通常は各テストの完了時にトランザクションをロールバックしますメソッドを使用すると、このデフォルトのトランザクション動作を変更できます。Javadoc から:setComplete()

デフォルトがロールバックに設定されている場合でも、このテスト メソッドに対してトランザクションをコミットさせます。

ドキュメントの次のセクションでは、より具体的な使用例を示します。

8.3.6.3. 取引管理

AbstractTransactionalSpringContextTestsPlatformTransactionManagerアプリケーションコンテキストで定義されている Bean に 依存し ます。タイプごとにオートワイヤーを使用するため、名前は重要ではありません。

通常、サブクラスを拡張します AbstractTransactionalDataSourceSpringContextTests。また、このクラスでは、DataSource Bean 定義 (ここでも任意の名前を使用) がアプリケーション コンテキストに存在する必要があります。便利なクエリに役立つインスタンス変数を作成し、 JdbcTemplate選択したテーブルの内容を削除するための便利なメソッドを提供します (トランザクションはデフォルトでロールバックされるため、安全に実行できます)。

トランザクションをプログラムでコミットしたい場合 (通常ではあり ませんが、特定のテストでデータベースにデータを入力する場合に役立つ場合がありますsetComplete())、から継承され たメソッドを呼び出すことができます AbstractTransactionalSpringContextTests。これにより、トランザクションはロールバックではなくコミットされます。別の方法として、Java 5 以降を対象として開発し、 を拡張 AbstractAnnotationAwareTransactionalTestsしている場合は、テスト メソッドに で注釈を付けて、 @Rollback(false)構成を通じて同じ効果を得ることができます。

メソッドを呼び出すことで、テスト ケースが終了する前にトランザクションを終了できる便利な機能もあります endTransaction()。これにより、デフォルトでトランザクションがロールバックされ、setComplete() 以前に呼び出された場合にのみコミットされます。この機能は、Web またはトランザクション外のリモート層で使用される Hibernate マップ エンティティなど、「切断された」データ オブジェクトの動作をテストする場合に役立ちます。多くの場合、遅延読み込みエラーは UI テストによってのみ発見されます。を呼び出すendTransaction()と、JUnit テスト スイートを通じて UI が正しく動作することを確認できます。

Hibernate Session#flush()は非常に異なります。保留中の変更をデータベースに書き込むように Hibernate に指示するだけで、トランザクションとは対話しません。

于 2010-10-11T21:03:17.430 に答える