2011-02-23 133 views
1

服务方法时的问题我有这2种方法在同一服务类:的Grails:调用其他服务方法

 
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中的所有代码,但这意味着我会复制很多代码(在我的真实示例中,我想在许多地方重复使用某些逻辑)。我怎么能重用代码的一种方法,通过将所有方法栈在同一个事务中运行的服务(如果这是真正问题所在,否则:“有什么问题”)

+0

可让我们看到dom1的域映射以及引用它的任何其他类。 – hvgotcodes 2011-02-23 00:41:20

回答

1

这个错误发生在实例ClassA被ClassB的一个实例引用,并且B的级联设置将导致A的实例被保存,并且您删除了A的实例。修复很简单,就是执行异常说的内容,并从任何一个域类中移除classA引用它。

你的情况DOM1

所以由Hibernate的Session另一个对象引用。你需要通过你的域模型并找出关联是什么,然后从其他实例中删除dom1。

原因取出保存呼叫使代码看起来工作,是因为没有保存,你可能不保存正在访问DOM1另一个实例,导致开始与错误。没有保存这个实例,就没有级联。

除非你是配置交易自己,第一个服务方法调用中发生的所有服务方法调用中应使用同一个事务。所有服务方法都参与相同的事务,除非您明确写入代码以便不这样做。你可能会在...发布内容。

+0

好的,但在那之后,我得到一个“由另一个事务更新或删除行(或未保存值映射不正确)” - (transactional = false它引发相同的异常,但它可以保存)。那么,关于服务交易的再一次:如果我直接从meth1()中调用meth2(),那么是否会进行2次交易? – cripox 2011-02-23 01:05:21

+0

@cripox之后是什么?我更新了我的答案更多...简短答案是否定的,除非您明确地创建交易,否则对于所有服务方法调用应该只有一个事务。 – hvgotcodes 2011-02-23 01:15:21

+0

@hygotcodes - 我的意思是 - 解决了参考问题之后。这只是一个副作用。 - 明天我会挖更多。感谢你的回答。 – cripox 2011-02-23 01:22:33

相关问题