【问题标题】:How I can delete grails domain object with many-to-many relationship?如何删除具有多对多关系的 grails 域对象?
【发布时间】:2015-03-16 09:56:43
【问题描述】:
class Client {
String name
String surname
String address
static hasMany = [departments:Department]
}
class Department {
/*static constraints = {
}*/
String depName
String location
static hasMany = [clients:Client]
static belongsTo = Client
}
def deleteDepartment(){
def values = params.list('departments')
def checkedID = new Integer[values.size()]
for(int i=0; i<values.size(); i++){
String temp = values.get(i).toString()
checkedID[i] = temp.toInteger()
}
for(int i=0; i<checkedID.length; i++){
def department = Department.get(checkedID[i])
department.clients.clear() //something
department.save() //wrong
}
}
客户有很多部门。如何在不删除客户端域对象的情况下删除与客户端域类有关系的部门域对象?
【问题讨论】:
标签:
grails
many-to-many
relationship
【解决方案1】:
这个怎么样?
Department.get(id).delete()
您不需要清除客户端,因为在您的 r/ship 中您没有 Client 属于 Department r/ship。
department.clients.clear() //something
【解决方案2】:
这是一个常见问题。当您创建多对多关系时
您的案例将创建三个tables client, 'departmentandclient_department`。
现在当您尝试删除部门时。 Hibernate 尝试从部门表中删除部门。
这将失败,因为它的条目已经保存在带有外键引用的client_department 表中。
理想情况下,这应该首先删除映射条目,然后从表中删除部门。但这不是它的工作原理。
因此,维护多对多关系的一个很好的解决方法是将此映射掌握在自己手中,如下所示。
Client{}
Department{}
ClinetDepartment{
Client client;
Department department;
}
然而,这将迫使您也独立保存对象。
喜欢
client.save();
department.save();
new ClinetDepartment(client,department).save();
删除时你可以做
clinetDepartment.delete();
department.delete();
【解决方案3】:
我找到了解决办法
def department = Department.get(checkedID[i])
def tmp = []
department.clients.each {tmp << it}
tmp.each {department.removeFromClients(it)}
department.delete(flush:true)