考虑以下域类
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的例子,但没有看到相反的例子。
答案 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"
}