2010-09-14 2 views
1

Мой класс домен, как это:Grails транзакций на уровне блоков с BeforeUpdate перехватчик дает StackOverflowException

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 был назван рекурсивно.

ожидать, что ваши предложения стоит преодолеть эту проблему

+0

Можете ли вы использовать форматирование кода, чтобы люди могли читать код, пожалуйста, – leebutts

+0

Можете ли вы обновить свой вопрос, чтобы ответить на следующее: 1) где в вашем приложении указано 'updateAccount'? Контроллер? Домен? 2) Можете ли вы опубликовать содержимое получаемого вами исключения? –

ответ

1

ли AuditTrail имеет отношения каскадных на счет? Это может вызвать проблемы.

Другое, что может случиться, заключается в том, что сохранение AuditTrail вызывает сеанс флеша, который также сохраняет измененные объекты Account.

Вы пытались использовать afterInsert вместо этого?

+0

afterInsert, вероятно, лучшее место для работы. Вы также захотите запустить его в новом сеансе Hibernate: 'Account.withNewSession {session -> new AuditTrial (eventName:" update "). Save()}' –

Смежные вопросы