2013-10-23 28 views
4

在我的服務中,我創建了一個「根」對象,該對象與許多對象關聯,而這些對象又與更多對象關聯等等。一旦根對象完全構建並準備好保存,我想在根對象上調用save,並將所有關聯的對象一直保存下來。現在我有一個名爲deepSave的遞歸方法。有沒有更好的辦法?無論如何要在Grails中執行「深度保存」?

+0

您是否看到使用級聯保存關聯的問題?如果關聯正確,所有關聯應級聯保存。你能舉出一個根和它的孩子的例子嗎? – dmahapatro

+0

我不確定你的意思是「級聯保存」。如果你的意思是「belongsTo」,那麼我認爲我不能安全地使用它。我將在明天添加一個示例,但是如果您想象一個具有許多深層次的XML文檔,它實際上就是我的Grails域的來源。所以想象一下類'element',它具有許多''元素'並且還有許多'屬性'。 – ubiquibacon

+0

我應該更具體地使用'belongsTo'或'cascade',而不是從表面上指出。 :) – dmahapatro

回答

6

如果使用belongsTo GORM自動爲您定義級聯。這意味着:如果A belongsTo B,則保存B時A將被保存。但是,它可以定義級聯,而無需使用belongsTo(如果這不適合於你的域模型):

class Author {  
    static hasMany = [books: Book] 
    static mapping = { books cascade: 'all-delete-orphan' } 
} 

你應該看看由GORM提供的cascade財產。另外hibernate documentation提供更詳細的信息。

+2

啊,這是我失蹤的。摘自[瞭解級聯更新和刪除](http://grails.org/doc/latest/guide/single.html#cascades):***如果您未定義belongsTo,則不會發生級聯,您將擁有手動保存每個對象(除非是一對多的情況,在這種情況下,如果新實例在hasMany集合中,保存會自動級聯)***我的一些對象不是'hasMany '集合。 – ubiquibacon

+0

使用'deepSave'方法在遞歸調用對象上的save(validate:false)方法比在我的「根」對象上調用save(deepValidate:false,validate:false)要快得多(這是令人失望的) 。 – ubiquibacon

相關問題