私には少し奇妙な点があります。誰かが光を当ててくれることを願っています。と を使用Hibernate 3.6.10
してSpring Framework 3.1.2.RELEASE
います。
と の両方に@Controller
注釈が付けられたwith メソッドがありますが、これは悪いことだとわかっています。いくつかの面倒な問題があるため、今のところこの方法で行う必要がありますが、それはここでの問題ではありません。すべての遅延読み込みは、コントローラー/トランザクション内で期待どおりに機能します。@RequestMapping
@Transactional
これらのトランザクション メソッド@Service
は、plain old でマークされた with メソッドを呼び出します。これは、デフォルト@Transactional
のように、すべてを同じトランザクションに保持する必要Propagation.REQUIRED
があります。ここまでは順調ですね。
さて、ここで困惑の一口です。このメソッドは、おそらくトランザクションをロールバックのみとしてマークする、extends@Service
をスローします。このロジックにより、使用されている唯一のトランザクションはロールバックされ、トランザクションが終了する前に再スローせずにメソッド内で を処理しようとすると、トランザクションがマークされているためにコミットアクションが失敗したと言って Hibernate からあまり期待されない別の結果が生じるはずです。ロールバックのみ。しかし、そうではありません。XyzException
RuntimeException
XyzException
@Controller
RuntimeException
代わりに、トランザクションがロールバックされ、リダイレクト (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