Grails 删除GORM中的子-父关联

Grails 删除GORM中的子-父关联,grails,gorm,Grails,Gorm,考虑以下域类 class Business{ static hasMany = [contacts:ContactPerson] } class ContactPerson{ } 给定以下域类,假设我们使用以下示例: 爱丽丝是ACME的联系人。鲍勃和卡罗尔是灾难公司的联系人 假设我想删除ContactPerson表中的Bob。因此: bob.delete(flush:true) 但代码将导致服务器抱怨违禁品: ERROR: update or delete on table "co

考虑以下域类

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

class ContactPerson{
}
给定以下域类,假设我们使用以下示例:

爱丽丝是ACME的联系人。鲍勃和卡罗尔是灾难公司的联系人

假设我想删除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仍然与灾难公司有关联

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


我在上看到过一些例子,但不是相反。

我相信,只要在下面添加一个
,级联就会像预期的那样工作

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

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

嗯。经过进一步的挖掘,我终于得到了我想要的代码。约翰·雷利斯在上的帖子特别有用。在本文中,他提到了如何从子对象查询到父对象(这正是我要寻找的)

回到问题上来,我想从ContactPerson表中删除Bob,但是考虑到业务和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)
我还向业务域模型添加了一个新映射:

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

{contacts:ContactPerson}不应该是[contacts:ContactPerson]吗?您几乎有两个选择——添加belongsTo(您说您不想这样做)或首先解除家长与孩子的关联。如果爱丽丝的公司被删除了,你为什么要留住她?也许模型需要以不同的方式表示?(就像联系业务的联接表)将花括号改为方括号。谢谢,奥尔德林。现在,问我为什么要留下爱丽丝。嗯,我想保留一份企业和联系人的目录。因此,即使ACME不再在数据库中,我仍然希望Alice也在其中(可能Alice搬到了另一家公司,我想把它与另一家公司联系起来)。或者说Bob搬到了另一家不在数据库中的公司,所以我想在ContactPerson表中删除他。在这种情况下,我该怎么做?使用GORM,Alice不知道她与Acme有任何关联。从联系人到企业的双向流动是否安全?如果我加上另一个人,道格,而他与任何企业都没有关联呢?在数据库中创建一个伪公司只是为了满足关联性,这是否切实可行。谢谢