2010-03-04 40 views
5

我有一个域对象,它根据属于同一个域对象的参数来保存计算结果。我想确保任何时间参数被用户更改,它会重新计算并正确保存到数据库中。在AfterInsert/AfterUpdate中修改对象

我想用afterInsert(为了确保计算正确的第一个地方)和afterUpdate。

但是,由于我的计算是试图修改对象本身,它不工作 - 抛出各种休眠异常。

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

现在我得到的例外是:

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

是专为简单的用例的GORM事件?我试图得出结论,修改你在保存中的对象不是要走的路。

+0

什么这个问题的解决方法。我也面临着这个困境。 * .withNewSession *似乎不适用于afterInsert。我无法刷新对象,也没有保存它(以及我可以.save(),但似乎我在afterInsert中完成的计算不会在数据库中保留,如果我只是使用.save())。谢谢!无论如何,我只想将一个用户对象保存在我的域类(例如,消息)中创建它。由于audit-trail只保存一个Long引用(例如,createdby),所以我最终无法操纵Message域的类并最终引用它的属性 – 2010-06-02 05:57:53

回答

2

是否有任何理由反对使用beforeInsertbeforeUpdate而不是afterInsertafterUpdate

如果不是,切换到before*事件处理程序

+1

在afterInsert触发时,我认为对象几乎是持久的,并且有一个id,但我可能是错的 - 整个持久化过程(带有事件)似乎没有很好的记录。 – 2010-03-05 09:43:55

+0

事实上,如果您的计算使用'id'属性,那么将代码放入before处理程序可能会有问题。而且我不知道生成id时会触发哪个事件。 – fabien7474 2010-03-05 13:22:56

3

是否使用1.2.0+应该解决您的问题?

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

欢呼

+0

是的,我在1.2.1上。我尝试使用withNewSession,但这并没有帮助,导致奇怪的休眠错误。 – 2010-03-05 09:41:58