为什么domainObject.discard()在Grails中的@Transactional服务中不起作用?

时间:2012-02-16 16:05:06

标签: spring grails transactions

我的服务中有一个方法,@Transactional注释。 在里面,我正在用2个对象做各种事情,最后,我想对其中一个进行.discard()更改,因此它不会保存在此事务中。 我所做的是将有关object2的信息发送到我的ActiveMQ队列,由侦听器接收它,在那里完成了一些工作,最后它保存在另一个事务中。 Object1应该像往常一样保存。

然而,这不起作用。发生的事情是,我的队列中的侦听器能够.get()该对象,在第一个事务结束之前对其进行一些更改并.save()。多亏了这一点,我得到org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)

我在服务中执行.get()个对象。退出服务并返回控制器时会保存事务。

如何防止Grails在主事务中保存object2?

1 个答案:

答案 0 :(得分:0)

您可以在服务方法结束之前在object2上尝试.refresh()。这将使用数据库中的更新数据重新加载和覆盖object2中的任何数据,因此乐观锁定version变量匹配(我认为这是导致Exception的原因)。并且Hibernate不需要刷新对象,因为它现在与数据库匹配。