Remover Associação entre objetos
17/05/2012 22:46
0
Olá amigos!
Considere os Domínios:


class Professor implements Comparable {

static searchable = true
String nome
Date dataAdmissao

static belongsTo = [cidade: Cidade, escola: Escola]

static hasMany = [aluno: Aluno]

int compareTo(obj) {
id.compareTo(obj.id)
}

String toString(){
return "${this.nome}"

}
}



class Cliente implements Comparable{

String codigo
String nome

static belongsTo = [professor: Professor]

int compareTo(obj){
id.compareTo(obj.id)
}

String toString(){
return "${this.nome}"
}

}



Antes de deletar um professor preciso remover todos os alunos que estão associados a ele para que esses alunos não sejam excluídos também. Tento fazer isso com o código abaixo:

ProfessorController

def delete = {
def professorInstance = Professor.get(params.id)

try {

if(professorInstance.aluno){
def alunosRelacionados = professorInstance.aluno.findAll{it.id > 0}
professorInstance.removeFromAlunos(alunosRelacionados)
}

professorInstance.delete(flush: true)
flash.message = "Professor Excluído"
redirect(action: "list")
}
...



Mas está dando um erro:


Error 500: Executing action [delete] of controller [ProfessorController] caused exception: groovy.lang.MissingMethodException: No signature of method: static Professor.removeFromAlunos() is applicable for argument types: (java.util.HashSet) values: [[Antrilho Passos, Agustinho Carrara]] Possible solutions: removeFromAluno(java.lang.Object)


Como posso arrumar isso.
Grato.
Tags: error 500


0
Oi, João.

Publica sua classe Aluno. Pode ser algum erro relacionado à ela.

E quando for criar relacionamentos de 1 para muitos, opte por escrever o atributo no plural:

static hasMany = [alunos: Aluno]
18/05/2012 00:17


0
Concordo com o colega sobre o "alunos" ao invés de "aluno".

Amigo, acho que o que você quer não precisa ser eito em código e sim na configuração GORM da classe. Sugiro:

static hasMany = [alunos: Aluno]
static mapping = { alunos cascade: "delete" }


Dai, quando você for excluir um registro de Professor, todos os alunos associados serão excluídos antes ;)


0
Oi João, a classe que eu coloquei com o nome de Cliente, na verdade, é a Aluno mesmo.

Valeu José, você tem razão, eu é que não expliquei direito. Eu quero o contrário. Não quero remover os alunos e sim a associação entre eles e o professor, pois eu quero que os alunos sejam mantidos mesmo quando o professor for deletado, ou seja, no banco de dados os campo professor_id da tabela Aluno tem que ficar NULL.
Entendeu?
18/05/2012 19:47


0
Então acho que isso resolve:

professorInstance.alunos.each{
it.professor=null
it.save() // não tenho certeza se essa linha é necessária
}


0
Só para dizer que funcionou.
Valeu José.
27/06/2012 23:16



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto