Grails:从其他服务方法调用服务方法时出现问题

时间:2011-02-23 00:09:50

标签: hibernate grails transactions gorm

我在同一服务类中有这两种方法:

boolean meth1(DomClass dom1) { //parameter is an instance of domain class DomClass
    ...
    meth2(dom1)
    ...
    dom1.delete(flush: true)
    ... 
    return true
}

boolean meth2(DomClass dom1) {
   ...
   dom1.changeSomeProperty
   dom1.save(flush:true)
   return true
}

问题是,在调用dom1.delete(flush: true)的行上,程序与deleted object would be re-saved by cascade (remove deleted object from associations)崩溃。

现在,我不太了解Hibernate,但我的猜测是,两种方法都是创建一个新事务,而meth1有第一个事务,meth2是第二个事务。事实上,如果我删除dom1.save一切正常。

现在,我的问题:我可以让meth1包含来自meth2的所有代码,但这意味着我重复了很多代码(在我的实例中我想在很多地方重用一些逻辑)。如何通过使所有服务方法堆栈在同一事务中运行来重用一个方法上的代码(如果这确实是问题,否则:“有什么问题?”)

1 个答案:

答案 0 :(得分:1)

当ClassA的实例引用ClassA的实例时发生错误,并且B的级联设置会导致A的实例被保存,并且您删除A的实例。修复很简单,做到了什么异常说并从任何域类中引用它来删除classA。

所以在你的情况下,dom1被hibernate会话中的另一个对象引用。您需要通过您的域模型并找出关联的内容,然后从另一个实例中删除dom1。

删除保存调用的原因使得代码看起来工作是因为没有保存,您可能不会保存正在访问dom1并导致错误开始的其他实例。如果没有保存该实例,则没有级联。

除非您自己是配置事务,否则在第一个服务方法调用中发生的所有服务方法调用都应使用相同的事务。除非您明确地将代码编写为不以这种方式执行,否则所有服务方法都参与同一事务。你发布的内容可能有些内容。