Grails 在AfterInsert/AfterUpdate中修改对象

Grails 在AfterInsert/AfterUpdate中修改对象,grails,gorm,Grails,Gorm,我有一个域对象,它保存基于参数的计算结果,这些参数是同一个域对象的属性。我希望确保用户更改任何参数时,都会重新计算并正确保存到数据库中 我正试图通过afterInsert(首先确保计算是正确的)和afterUpdate做到这一点 但是,由于我的计算试图修改对象本身,因此它无法工作-引发各种hibernate异常 我试图将afterUpdate代码放入事务中,但没有帮助。恐怕我在这里遇到了一个循环依赖问题 我现在得到的例外是: org.hibernate.StaleObjectStateExcep

我有一个域对象,它保存基于参数的计算结果,这些参数是同一个域对象的属性。我希望确保用户更改任何参数时,都会重新计算并正确保存到数据库中

我正试图通过afterInsert(首先确保计算是正确的)和afterUpdate做到这一点

但是,由于我的计算试图修改对象本身,因此它无法工作-引发各种hibernate异常

我试图将afterUpdate代码放入事务中,但没有帮助。恐怕我在这里遇到了一个循环依赖问题

我现在得到的例外是:

org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [esc.scorecard.PropertyScorecard#27]

GORM事件是为更简单的用例设计的吗?我想得出结论,修改你在储蓄中间的对象并不是前进的方向。 是否有任何理由反对使用插入前<代码>和更新前<代码>而不是插入后<代码>和更新后<代码>

如果没有,则切换到*事件处理程序之前的
,应该可以解决您的问题

是否使用1.2.0+

如果是,您可以在事件闭包中使用.withNewSession,这应该可以避免休眠混乱

干杯


是的,我在1.2.1上。我尝试使用withNewSession,但没有帮助,导致了奇怪的hibernate错误。我认为在Insert触发后,对象几乎被持久化了,到那时已经有了id,但我可能错了-整个持久化过程(带有事件)似乎没有很好的文档记录。事实上,如果您的计算使用了“id”属性,将代码定位到before*处理程序中可能会有问题。我不知道生成id时触发了哪个事件。您解决这个问题的方法是什么。我也面临着这个困境。withNewSession似乎不适用于afterInsert。我不能刷新对象,也不能保存它(我可以.save(),但如果我只使用.save(),我在afterInsert中完成的计算似乎不会持久化到数据库中)。谢谢无论如何,我只想做的是在创建它的域类(例如Message)中持久化一个用户对象。由于审计跟踪只保存了一个长引用(例如createdby),因此我无法最终操作消息域类并最终引用其attrib