2012-09-14 53 views
0

我有三個域模型Type1Type2Details遵循以下關係:GORM級聯刪除掉

class Type1 { 
    static hasMany = [detail: Detail] 
} 
class Type2 { 
    static hasMany = [detail: Detail] 
} 
class Detail { 
    Type1 type1 
    Type2 type2 
    static belongsTo = [Type1, Type2] 
    static constraints = { 
    type1(nullable:true) 
    type2(nullable:true) 
    } 
} 

的問題是,我不能讓Type1.detail被轉移到Type2.detail每當Type1是要轉換爲Type2注意:Type1和Type2只是java.lang.Object的孩子)。換句話說(在控制器):

Type1 type1 = Type1.get(params.id) 
List type1Details = Detail.findAllByType1(type1) 
type1.detail.clear() 

Type2 type2 = new Type2() 
// transfer other properties of type1 to type2 
type1Details.each { type2.addToDetail(it) } 

if(type2.save(flush:true) { 
    type1.save(flush:true) 
    type1.delete(flush:true) 
} 

問題是,只更新type1Details,我們怎麼能設置type1Details*.type1 = nulltype1Details*.type2 = type2

回答

0

在嘗試瞭解如何解決這個問題的所有可能的指令序列後,我最終得到了這個工作解決方案。從上面的問題中,我刪除了與Type1相關的所有Details,從而刪除detail表中與Type1.detail相關的記錄。

Type1 type1 = Type1.get(params.id) 
Type2 type2 = new Type2() 

// transfer other properties of type1 to type2 
type1.detail.each { 
    Detail element = (Detail) it 
    element.type1 = null 
    element.type2 = type2 
    } 
type1.detail.clear()    
if(type2.save(flush:true)) { 
    type1.delete(flush:true) 
} 

從上面的代碼,很顯然它是如何做。我知道這不是最好的解決方案,但我仍然可以接受更好的解決方案。