Frage

Ich habe die folgende Situation (natürlich vereinfacht):

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>

Das Problem tritt auf, wenn Dosenthing () RunTimeException wirft. Diese RunTimeException -Rollback -Transaktion und beendet auch die Hibernate -Sitzung. Wenn ich doaction.gsp nach dem RunTimeErrror rendere, endet es mit einem Fehler, da das faule geladene Feld eine andere Domäne nicht gelesen werden kann (keine Sitzung). Jetzt können Sie sagen "OK, verwenden Sie keine RunTimeException", aber ich brauche den automatischen Transaktionsrollback.

Irgendwelche Ideen, wie man die Hibernate -Sitzung offen hält, auch wenn RunTimeException im Transaktionsdienst stattfindet, damit das faule Laden in GSP ordnungsgemäß rendern kann? Vielen Dank.

War es hilfreich?

Lösung

Wenn Ihre Hibernate -Sitzung während des Rollback- und Xception -Werfens zerstört wird, können Sie versuchen, es manuell wieder an die aktuelle Hibernate -Sitzung wieder zu bringen:

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]
  }
}

Hoffe das ist für deine Bedürfnisse geeignet.Bezug

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top