GORM级联删除关闭

时间:2012-09-14 03:51:29

标签: grails gorm cascade

我有三个域模型Type1Type2Details遵循以下关系:

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

1 个答案:

答案 0 :(得分:0)

在尝试了有关如何解决此问题的所有可能的指令序列后,我最终得到了这个有效的解决方案。根据上述问题,我删除了与Details相关的所有Type1,从而删除了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)
}

从上面的代码中可以看出它是如何完成的。我知道这不是最好的解决方案,但我仍然可以接受更好的解决方案。