2

私には少し奇妙な点があります。誰かが光を当ててくれることを願っています。と を使用Hibernate 3.6.10してSpring Framework 3.1.2.RELEASEいます。

と の両方に@Controller注釈が付けられたwith メソッドがありますが、これは悪いことだとわかっています。いくつかの面倒な問題があるため、今のところこの方法で行う必要がありますが、それはここでの問題ではありません。すべての遅延読み込みは、コントローラー/トランザクション内で期待どおりに機能します。@RequestMapping@Transactional

これらのトランザクション メソッド@Serviceは、plain old でマークされた with メソッドを呼び出します。これは、デフォルト@Transactionalのように、すべてを同じトランザクションに保持する必要Propagation.REQUIREDがあります。ここまでは順調ですね。

さて、ここで困惑の一口です。このメソッドは、おそらくトランザクションをロールバックのみとしてマークする、extends@Serviceをスローします。このロジックにより、使用されている唯一のトランザクションはロールバックされ、トランザクションが終了する前に再スローせずにメソッド内で を処理しようとすると、トランザクションがマークされているためにコミットアクションが失敗したと言って Hibernate からあまり期待されない別の結果が生じるはずです。ロールバックのみ。しかし、そうではありません。XyzExceptionRuntimeExceptionXyzException@ControllerRuntimeException

代わりに、トランザクションがロールバックされ、リダイレクト (POST、リダイレクト、GET を使用) が正常に行われます。例外も混乱もありません。

So the question is, "What am I doing to make this work as it does?"

私は使用されているので、トランザクションは実際にはレベルOpenSessionInViewInterceptorで開始されていないのではないかと思いました。@Controllerただし、を削除する@Transactionalと、Lazy Load アクションが壊れました。

- 編集 -

OSIVのナンセンスに関係なく、メソッドのXyzException 内部を処理できるということは理にかなっていますか? 再スローされていないメソッド内のhandled sはエラーを引き起こす@Transactionalと思いました。問題のメソッドがエントリ ポイント (つまり、最初に呼び出されたメソッド) であることは重要ですか?RuntimeException@Transactional@Transactional@Transactional

4

0 に答える 0