私はSpringテストフレームワークを使ってhibernateセッションのsave()メソッドをテストしたいと思っています。 @Test方法は次のとおりです。アクティブなバネトランザクション内でデータをdbにフラッシュする方法はありますか?
@Test
@Transactional
public void testSave() {
User expected = createUser();
getGenericDao().currentSession().save(expected);
User actual = getUser(generatedId);
assertUsersEqual(expected,actual);
}
は、私はデータベースにユーザーをフラッシュします。私は私のユーザーは、この方法の後に、データベースに
getGenericDao().currentSession().save(expected);
になりたいそれから私は、春のデータフレームワークを使用してデータベースにアクセスして、これは次の行でユーザーを保存取得したい:
User actual = getUser(generatedId);
私は休止状態を使用しようとしました次のような方法をフラッシュしてください:
currentSession().setFlushMode(MANUAL);
//do saving here
currentSession().flush();
私のユーザーをデータベースにフラッシュしません! しかし、私は@ Transactional Spring Annotationを使用せず、プログラムによるSpringトランザクションでユーザーを保存すると、私は自分が望むものを達成します。残念ながら、db に保存されたユーザーは、スプリング@Transactionalがないためロールバックされません。したがって、私のテストメソッドは、その後のテストメソッドのdbと動作を変更します。
私は自分のユーザーをdb内のテストメソッド(最後ではない)にフラッシュし、テストメソッドの終わりにdbへのすべての変更をロールバックする必要があります。
@Transactional
public void doSave(User user){
getGenericDao().currentSession().save(user);
}
をそしてtestSave内部にdoSaveは何もしていない呼び出し:
UPDATEの提案は、次のようにメソッドを作成しました。まだ私はこのメソッドを実行した後、dbにユーザーがいません。私はブレークポイントを設定し、コマンドラインから私のdbをチェックする。
更新日お返事ありがとうございます。問題は、メソッドflush()が私のユーザをdatabase.Iに入れないということです。私はIsolation.READ_UNCOMMITTEDを試して、ユーザをデータベースに入れません。 @Testメソッドで春のトランザクションをオフにして、プログラムによるトランザクションで保存するだけで、私が望むことを達成できます。しかし、@Testメソッドは、後続の@Testメソッドのために保存されたユーザーを残してロールバックされません。ここで@Testメソッドは、ユーザーを削除する@Testメソッドは、ロールバックされていないため、ユーザーを保存するように危険ではありません。だから、私はとにかに私のユーザ(または削除)をdbに入れることができない@Testメソッドのトランザクションサポートを跳ね返す必要があります。実際には、@Testメソッドが終了し、@Testメソッドのトランザクションがコミットされた後にのみ、ユーザーはdbに置かれます(または削除されます)。 @Testメソッドの途中でユーザをdbに保存して、@Testメソッドの最後にロールバックします。
ありがとうございました!
GenericDaoクラスも教えてもらえますか? 編集:実際には、私は問題を見ると思います。データが実際にデータベースに保存される前に、現在のトランザクションをコミットする必要があります。つまり、保存するメソッドとロードするメソッドの2つの@ Transactionメソッドが必要です。 –
私が正しく行ったかどうか確認してください –
閉じる。私は非トランザクション関数によって呼び出される2つのトランザクション関数があることを意味します。それはうまくいくはずです... –