Oi Norma, alguns pontos para você verificar.
Como está a definição da sua tabela que faz o relacionamento muitos para muitos? Ela deve ter uma restrição do tipo unique que permita apenas um registro com o mesmo aluno e mesma disciplina, certo?
Além disto, tem como você nos mostrar também como estão suas classes de domínio para que possamos entender melhor o problema?
package br.meu.cad
class Aluno {
static hasMany = [
disciplinas: Disciplina
]
String nome
String matricula
static constraints = {
nome nullable: false
matricula nullable: false
disciplinas nullable: true
}
static mapping = {
table 'aluno'
matricula column: 'cd_aluno',
nome column: 'nm_aluno',
disciplinas column: 'cd_aluno',
joinTable: 'aluno_disciplina'
}
String toString() {
return nome
}
}
----------------------------------------------
package br.meu.cad
class Disciplina {
static hasMany = [
alunos: Aluno
]
static belongsTo = Aluno
String nome
String codigo
static constraints = {
nome nullable: false
codigo nullable: false
}
static mapping = {
table 'disciplina'
codigo column: 'cd_disciplina',
nome column: 'nm_disciplina',
alunos column: 'cd_disciplina',
joinTable: 'aluno_disciplina'
}
String toString() {
return nome
}
}
Quando eu crio um aluno, consigo selecionar uma ou mais disciplinas para ele sem problemas. O problema ocorre quando quero editar o aluno, não importa quantas ou quais disciplinas eu escolho, na hora de salvar ele dá um erro dizendo que a chave foi duplicada.
Olá Norma, bem vinda ao Grails :)
Tem como você mandar o código do update da sua controller Aluno?
Suas views e controllers foram geradas pelo scaffolding? qual versão do grails?
Oi Dyego
Obrigado por responder. Eu estou usando o scaffolding do Grails, ele montou para mim todos os métodos CRUD. Estou utilizando o Grails 2.3.1
Preciso fazer os método de UPDATE manualmente para os casos que tenho relação Muitos para Muitos?
Certo, você usou o comando "generate-all" ou "generate-controller" para gerar a controller ou está usando apenas "def sacaffolding" na controller? Se não tiver usado, use este comando para poder ter acesso ao código da controller gerada pelo scaffolding, ai vc conseguirá ver exatamente o que ele está fazendo.
Pelo que eu me lembro dessas versões do grails (2.3.1 ou 2.3.2) elas ainda não tratavam este tipo de relacionamento corretamente.
Se preferir poste o código do update da controller.
Oi Dyego
Eu fiz um generate-all. Estamos analisando aqui o console e percebemos que quando é feito a alteração ou inclusão de uma única disciplina o método exclui tudo da tabela intermediária e depois insere novamente. No caso de múltiplas disciplinas ele não faz o delete, insere direto na tabela intermediária e possivelmente está fazendo com que os registros fiquem duplicados.
Estou atualizando agora mesmo para a versão 2.4.0 para ver se resolve o problema.
Obrigadinho ^^