3

私たちのJavaプロジェクトでは、休止状態とSpringでORMを使用しています。永続オブジェクトの削除で問題が発生しました。たとえば、このサンプルメソッドはIDでエンティティを取得し、それらを削除します。

@Transactional
public void remove(List<Long> ids) {
    SearchTemplate template = new SearchTemplate();
    template.addParameter("milestoneId",ids);
    List <InvoiceQueue> items = this.findByCriteria(template);
    ...
    this.delete(items);
}

メソッドは例外なくOKを実行しますが、実際にはDBからアイテムを削除しません。

メソッド定義に次のアノテーションを追加すると@Transactional(propagation = Propagation.REQUIRES_NEW)、問題が解決します。

デフォルトの伝播タイプPROPAGATION_REQUIREDで機能しない理由を誰かが説明できますか?

前もって感謝します。

環境の詳細:

hibernate.version 3.5.5-Final、spring.version 3.0.5.RELEASE

4

1 に答える 1

2

本当に@PeterBagyinszkiが彼のコメントで言ったことを繰り返すだけですが、その理由はおそらく、他の部分が例外をスローしたために削除が発生したトランザクションがロールバックされ、トランザクション中に行われたすべての変更がキャンセルされるためです。ではPropagation.REQUIRES_NEW、削除はそれ自体の別のネストされたトランザクション内で行われます。ネストされたトランザクション (コミットまたはロールバック) の結果は、「外側の」トランザクションには影響しません。

ログをチェックして、トランザクションがロールバックされる原因を確認してください。単純な SELECT クエリのようなものでさえ、 NoResultException のようなもので失敗すると、トランザクションがロールバックされることに注意してください@Transactional。特定の例外に戻ります。

于 2012-05-22T07:58:49.653 に答える