如何删除具有多对多关系的grails域对象?

时间:2015-03-16 09:56:44

标签: grails many-to-many relationship

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域对象?

3 个答案:

答案 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();