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

How I can delete grails domain object with 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
    }
}

客户有多个部门。如何在不删除客户域对象的情况下删除与客户域 class 有关系的部门域对象?

我找到了解决方案

def department = Department.get(checkedID[i])
        def tmp = []
        department.clients.each {tmp << it}
        tmp.each {department.removeFromClients(it)}
        department.delete(flush:true)

这个怎么样?

Department.get(id).delete()

您不需要清除客户,因为在您的 r/ship 中您没有 Client 属于 Department r/ship.

 department.clients.clear() //something

这是一个常见问题。当您创建多对多关系时

您的案例将创建三个 tables client、“部门andclient_department”。

现在当您尝试删除部门时。 Hibernate 尝试从部门 table.

中删除部门

这将失败,因为它的条目已经保存在 client_department table 中并带有外键引用。

理想情况下,这应该首先删除映射条目,然后从 tables 中删除部门。但这不是它的工作原理。

因此,维护多对多关系的一个很好的解决方法是将此映射保留在您自己的手中,如下所示。

Client{}
Department{}
ClinetDepartment{
  Client client;
  Department department;
}

然而,这将迫使您也独立保存对象。

喜欢

client.save();
department.save();
new ClinetDepartment(client,department).save();

删除的时候可以做

clinetDepartment.delete();
department.delete();