在GORM中删除子父关联

时间:2011-11-10 09:02:31

标签: grails gorm

考虑以下域类

class Business{
    static hasMany = [contacts:ContactPerson]
}

class ContactPerson{
}

考虑到以下域类,请说我们使用以下示例:

  

Alice是ACME的联系人。 Bob和Carol是Calamity Corp的联系人。

说我想在ContactPerson表中删除Bob。因此:

bob.delete(flush:true)

但是代码会导致服务器抱怨约束:

ERROR: update or delete on table "contact_person" violates foreign key constraint
    "fk4a69c6b329ef2fe1" on table "business_contact_person"
Detail: Key (id)=(174) is still referenced from table "business_contact_person".

在这种情况下,抛出异常是因为Bob仍然与Calamity Corp.有关联。

如何从ContactPerson表中删除Bob?我想从数据库中删除Bob。我不想添加belongsTo,因为我不想将删除级联到Business的子级(也就是说,如果我从数据库中删除Acme Corp,我仍然希望Alice在系统中)。

我见过disassociating the parent from the child的例子,但没有看到相反的例子。

2 个答案:

答案 0 :(得分:4)

我相信只需添加一个belongsTo,级联应该按预期工作......

class Business{
  static hasMany = [ contacts:ContactPerson ]
}

class ContactPerson{
  static belongsTo = [ business: Business ]
}

答案 1 :(得分:4)

确定。因此,通过更多的挖掘,我终于得到了我想要的代码。 John Rellis在Relationship Advice : Grails One-To-Many上的帖子特别有帮助。在本文中,他提到了如何从子项查询到父项(这正是我要查找的内容)。

回到这个问题,我想从ContactPerson表中删除Bob,但是考虑到Business和ContactPerson之间的关系只是简单地调用bob.delete()就行了。我需要的是寻找与Bob相关的所有业务并删除该关联。因此下面的代码:

def bob = ContactPerson.get(params.id)

def criteria = Business.createCriteria()

def businesses = criteria.listDistinct{
    createAlias("contactPersons","c")
    eq("c.id", bob.id)
}

businesses.each{business->
    business.removeFromContactPersons(bob)
    business.save(flush:true)
}

bob.delete(flush:true)

我还在Business域模型中添加了一个新映射:

static mapping = {
    children cascade:"all-delete-orphan"
}