2015-03-16 3 views
1
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 со многими отношениями?

ответ

0

Это распространенная проблема. Когда вы создаете отношение «многие ко многим»

Ваш случай будет создавать три tablesclient, 'department and client_department`.

Теперь, когда вы пытаетесь удалить отдел. Hibernate пытается удалить отдел из таблицы отделов.

Это не удастся, поскольку его запись уже сохранена в таблице client_department с ссылкой на внешний ключ.

Это идеальное решение сначала удалить запись отображения, а затем удалить отдел из таблиц. но это не так, как это работает.

Таким образом, хорошим решением для поддержания многих отношений является сохранение этого картографирования в ваших руках, как показано ниже.

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

Это, однако, заставляет вас также сохранять объекты самостоятельно.

как

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

во время удаления вы можете сделать

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

Я нашел решение

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

Как насчет этого?

Department.get(id).delete() 

Вам не нужно очистить клиентов, потому что в вашем г/корабле вы не имеете Client принадлежит Department г/судно.

department.clients.clear() //something 
+0

Если я буду делать, как шоу, будет ошибкой с FK –

Смежные вопросы