2012-02-16 75 views
0

我有一种方法在我的服务中,有@Transactional注释。 里面,我正在做2个对象的各种东西,最后,我想.discard()其中之一的变化,所以它没有保存在这个事务。 我所做的就是将关于object2的信息发送到我的ActiveMQ队列中,由侦听器拾取它,在那里完成一些工作,最后保存在另一个事务中。 Object1应该照常保存。为什么domainObject.discard()在Grails的@Transactional服务中不起作用?

但是,这是行不通的。会发生什么情况是,我的队列上的听众能够在对象上执行.get(),并在第一次事务结束之前对其执行一些更改和.save()它。感谢那,我得到org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)。我执行.get()服务内的对象。退出服务并返回控制器时保存交易。

为了防止Grails在主事务中保存object2,我该怎么做?

+0

你不能把object2的访问权限放在你的服务中的一个单独的方法中,并让它不成为你的外部事务吗? – 2012-02-16 16:23:02

+0

不。这是使用排队机制的一个要点 - 在单独的事务中完成它[这不是唯一的一点,请注意]。 – Krystian 2012-02-16 16:26:11

+0

我不知道这个问题的答案,但现在可以解决.read()这个你可能不想保存的对象,然后它不会被保存,除非你明确地保存它。 – 2012-02-17 04:24:24

回答

0

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

+0

这可能会工作,但它会产生额外的查询,我不想这样。除此之外,它似乎不是单独的object2,它需要令人耳目一新,但它也是一个集合。 – Krystian 2012-02-18 07:57:49

相关问题