带有beforeUpdate拦截器的Grails块级事务提供StackOverFlowException

带有beforeUpdate拦截器的Grails块级事务提供StackOverFlowException,grails,Grails,我的域类如下所示: Class Account { String accountNo ... def beforeUpdate = { new AuditTrial(eventName:"update").save() } } 在我的应用程序中,有一个块级事务,如下所示: def updateAccount = { Account.withTransaction { status -> def source = Ac

我的域类如下所示:

Class Account {
    String accountNo
    ...
    def beforeUpdate = {
        new AuditTrial(eventName:"update").save()
    }
}
在我的应用程序中,有一个块级事务,如下所示:

def updateAccount = {
    Account.withTransaction { status ->
        def source = Account.get(params.from)
        def dest = Account.get(params.to)

        def amount = params.amount.toInteger() 
        if(source.active) { 
            source.balance -= amount 
            if(dest.active) {
                dest.amount += amount
            } else { 
                status.setRollbackOnly() 
            } 
        } 
    }
}
当我尝试调用这个
updateAccount
方法时,它给出了一个堆栈溢出异常。似乎是递归调用了
beforeUpdate
方法


期望您提出有价值的建议来解决此问题

AuditTrail与Account之间是否存在级联关系?这可能是造成问题的原因

另一件可能发生的事情是,保存AuditTrail会导致会话刷新,这也会保存修改过的Account对象


您试过改用afterInsert吗?

AuditTrail与Account是否有级联关系?这可能是造成问题的原因

另一件可能发生的事情是,保存AuditTrail会导致会话刷新,这也会保存修改过的Account对象


您是否尝试过改用afterInsert?

您是否可以使用代码格式化程序,以便人们阅读代码?请更新您的问题以回答以下问题:1)应用程序中哪里定义了
updateAccount
?控制器?域名?2) 您是否可以发布收到的异常的内容?您是否可以使用代码格式化程序,以便人们可以阅读代码?请更新您的问题以回答以下问题:1)应用程序中哪里定义了
updateAccount
?控制器?域名?2) 你能发布你收到的异常的内容吗?afterInsert可能是更好的工作场所。您还需要在新的Hibernate会话中运行它:
Account.withNewSession{session->newAuditTrial(eventName:“update”).save()}
afterInsert可能是更好的工作地点。您还需要在新的Hibernate会话中运行它:
Account.withNewSession{session->newAuditTrial(eventName:“update”).save()}