次の状況があります(もちろん単純化されています):
MyDomain.groovy:
class MyDomain {
MyAnotherDomain anotherDomain // lazy loaded
}
MyService.groovy:
class MyService {
boolean transactional = true
def doSomething(id) {
// ... some code...
}
}
MYController.groovy:
class MyController {
def myService
def doAction = {
MyDomain aaa = ...GET_IT_FROM_SOMEWHERE...
try {
myService.doSomething(id)
} catch (RuntimeError e) {
flash.message = 'sorry.guy.your.transaction.was.rollbacked'
}
[myData: aaa]
}
}
doAction.gsp:
<html>
<body>
${myData.anotherDomain}
</body>
</html>
doSomething() が RuntimeException をスローすると問題が発生します。この RuntimeException はトランザクションをロールバックし、Hibernate セッションも終了します。RuntimeError の後に doAction.gsp をレンダリングすると、遅延ロードされたフィールド anotherDomain を読み取ることができない (セッションがない) ため、エラーで終了します。これで、「OK、RuntimeException を使用しないでください」と言うことができますが、自動トランザクション ロールバックが必要です。
トランザクション サービスで RuntimeException が発生した場合でも Hibernate セッションを開いたままにして、gsp での遅延読み込みを適切にレンダリングできるようにする方法はありますか? ありがとう。