0

次の状況があります(もちろん単純化されています):

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 での遅延読み込みを適切にレンダリングできるようにする方法はありますか? ありがとう。

4

1 に答える 1

2

ロールバックおよびxceptionのスロー中にHibernateセッションが破棄された場合は、現在のHibernateセッションに手動で再接続してみてください。

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'
      if(!aaa.isAttached()) {
        aaa.attach()
      }
    }
    [myData: aaa]
  }
}

それがあなたのニーズに合っていることを願っています。 参照

于 2010-03-03T15:48:42.577 に答える