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
}
}
客户有很多部门。如何删除与Client域类有关系的Department域对象,而不删除Client域对象?
答案 0 :(得分:2)
这个怎么样?
Department.get(id).delete()
您无需清除客户,因为在您的r / ship中,您没有Client
属于Department
r / ship。
department.clients.clear() //something
答案 1 :(得分:0)
我找到了解决方案
def department = Department.get(checkedID[i])
def tmp = []
department.clients.each {tmp << it}
tmp.each {department.removeFromClients(it)}
department.delete(flush:true)
答案 2 :(得分:0)
这是一个常见的问题。当你创建多对多的关系时
您的案例将创建三个tables
client
,&#39;部门and
client_department`。
现在,当您尝试删除部门时。 Hibernate尝试从department表中删除部门。
这将失败,因为它的条目已经保存在带有外键引用的client_department
表中。
理想情况下,首先应删除映射条目,然后从表中删除部门。但这不是它的工作方式。
因此,维护多对多关系的良好解决方法是将此映射保存在您自己的手中,如下所示。
Client{}
Department{}
ClinetDepartment{
Client client;
Department department;
}
然而,这将迫使您独立保存对象。
像
client.save();
department.save();
new ClinetDepartment(client,department).save();
删除时可以执行
clinetDepartment.delete();
department.delete();