我有以下情况(当然是简化的):
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(无会话)。现在你可以说“好的,不要使用 RuntimeException”,但我需要自动事务回滚。
任何想法如何保持 Hibernate 会话打开,即使 RuntimeException 发生在事务服务中,以便 gsp 中的延迟加载可以正确呈现?谢谢。