0

@Transactional を正しく設定しましたが、次のメソッドでは「成功」が返されますが、レコードはテーブルから削除されません。

@Transactional
public void deleteLimXrefHvo(LimitXrefHvo limitXrefHvo){
    getSession().delete(getTableId(limitXrefHvo));
}

@Transactional で注釈が付けられたメソッド getTableId も試しましたが、問題は解決しません。また、 getTableId を呼び出し、戻り値を変数に格納してから delete() に渡しましたが、それも機能しませんでした。

私が試した唯一のことは、 getSession().flush(); を追加することです。削除トランザクションの後。@Transactional が設定されている場合は、後でフラッシュする必要はありません。私は何が欠けていますか?

4

2 に答える 2

0

問題を引き起こしたのは getTableId でした。getTableId は独自の getSession() を呼び出します。そのため、flush() を実行する必要があります。それを回避することはできません。理にかなっていますが。

于 2013-05-30T12:57:21.820 に答える
0

セッションは、単一のトランザクションより長く存続する場合があります。これはここに当てはまるようです。JSR-220 5.6から:

コンテナー管理の永続コンテキストは、その EntityManager の作成時に指定された PersistenceContextType に応じて、単一のトランザクションにスコープが設定された有効期間、または複数のトランザクションにまたがる延長された有効期間のいずれかを持つように定義できます。この仕様では、トランザクション スコープの永続コンテキストや拡張永続コンテキストなどの永続コンテキストをそれぞれ参照します。

Java EEコンテナではなく「Spring」と言ったことは知っていますが、同じ動作になると思います。

つまり、セッション スコープはトランザクション スコープと同じではありません。特定の問題については、次を確認してください。

  • 「deleteLimXrefHvo()」は別の@Transactionalメソッドから呼び出されていますか (ヒント: トランザクションの伝播はどうですか)?
  • トランザクションにはどのフラッシュ モードがありますか (手動ですか?)。

ログを調べてください。特に、トランザクション マネージャーのログ レベルを に設定して、DEBUGそれが何をしているかを正確に確認します。

于 2013-05-29T13:16:10.540 に答える