grava sem eu querer
17/10/2008 00:00
0
Olá pessoal,

to com uma dificuldade aq, e jah quebrei a cabeca um monte e nao sei o que esta acontecendo.

tenho uma rotina de alteracao dos dados, e quando o aluno altera o login, o sistema verifica se este login já existe no cadastro de alunos e no cadastro de docente, se nao existe, o sitema efetua as alteracoes do aluno e boa, mas se o login já existe, o sistema retorna para o formulario dizendo q o login já existe.

o problema é que mesmo quando o login é igual e o sistema acusa isto, ele grava o novo login no banco do mesmo jeito. eu nao passo pelo save() no codigo, mas o sistema grava.


def salvarAtua = {
autAluno()
def aluno = Aluno.get( params.id )
if(aluno) {
def l = aluno.login
aluno.properties = params
if( StringUtils.validaLogin( l,params.login ) == false )
aluno.errors.rejectValue( 'login','default.not.unique.message' )
if(!aluno.hasErrors() && aluno.save()) {
session.aluno = aluno
flash.message = "Aluno atualizado com sucesso"
render( view:'/mensagem' )
} else {
render(view:'atualizar',model:[aluno:aluno])
}
}
else {
render "Aluno não encontrado."
}
}


def salvar = {
def docente = Docente.get( params.id )
if(docente) {
if( StringUtils.validaLogin( docente.login,params.login ) ) {
docente.properties = params
if(!docente.hasErrors() && docente.save()) {
flash.message = "Docente alterado com sucesso!"
redirect(action:visualizar,id:docente.id)
}
else {
render(view:'atualizar',model:[docente:docente])
}
} else {
docente.properties = params
flash.error = "Login já existente."
render( view:'atualizar',model:[ docente:docente ] )
}
}
else {
flash.message = "Docente náo encontrado"
redirect(action:atualizar,id:params.id)
}
}


esses sao os dois jeitos q eu já tentei, mas nao consigo, ele continua gravando o login, mesmo se já existe.

q será q to fazendo de errado?
valeu..
Tags: Grails


0
me parece que o erro está no metodo StringUtils.validaLogin () . o que ele deve retonar é false qdo logins igual . como esta a classe Aluno ? A constraint esta como unique ?

Herrera
18/10/2008 00:00


0
Tentei de outro jeito mas tambem nao consigo:

def salvarAtua = {
autAluno()
def aluno = Aluno.get( params.id )
if(aluno) {
def l = aluno.login
aluno.properties = params
if( StringUtils.validaLogin( l,params.login ) == false ) {
// aluno.errors.rejectValue( 'login','default.not.unique.message' )
flash.error = "Este login já existe. Tente outro."
render( view:'atualizar',model:[aluno:aluno])
} else {
if(!aluno.hasErrors() && aluno.save()) {
session.aluno = aluno
flash.message = "Aluno atualizado com sucesso"
render( view:'/mensagem' )
} else {
render(view:'atualizar',model:[aluno:aluno])
}
}
}
else {
render "Aluno não encontrado."
}
}


essa eh a utils

// verifica se o login escolhido ainda nao existe (retorna true se nao existe)
def static Boolean validaLogin( String logAnt, String logNov ) {
if( logAnt.toLowerCase() == logNov.toLowerCase() )
return true
else {
def doc = Docente.findByLogin( logNov )
if( doc )
return false
else {
def alu = Aluno.findByLogin( logNov )
if( alu )
return false
else
return true
}
}
}


e essa a classe aluno

// tabela de alunos

class Aluno {

String matricula
String nome
String rua
Integer numero
String complemento
String cep
String bairro
String cidade
String estado
String telefone
String celular
String email
Integer anoIngresso // ano q comecou na turma
Integer semIngresso // semestre q comecou na turma
Integer curso // codigo do curso q o aluno esta matriculado
Turma turma // turma q ministra a disciplina
String tipo // tipo de aluno ( regular na turma, regular no curso, eletivo )
String traEmpresa // empresa que trabalha
String traFuncao // funcao de desenvolve na empresa
String login
String senha
Boolean ativo = true
Boolean formado = false
Date acesso // ultimo acesso

static hasMany = [ disciplinas:AluDisciplina ]

static constraints = {
matricula(maxSize:12,blank:false)
nome(maxSize:50,nullable:false,blank:false)
rua(maxSize:50,nullable:true,blank:true)
numero(maxSize:5,nullable:true,blank:true)
complemento(maxSize:50,nullable:true,blank:true)
cep(maxSize:10,nullable:true,blank:true)
bairro(maxSize:50,nullable:true,blank:true)
cidade(maxSize:50,nullable:true,blank:true)
estado(maxSize:2,nullable:true,blank:true)
telefone(maxSize:20,nullable:true,blank:true)
celular(maxSize:20,nullable:true,blank:true)
email(maxSize:50,email:true,blank:false)
traEmpresa(maxSize:50,nullable:true,blank:true)
traFuncao(maxSize:50,nullable:true,blank:true)
anoIngresso(range:1995..2050,blank:false)
semIngresso(range:1..2,blank:false)
curso(nullable:true,blank:true)
turma(nullable:true,blank:true)
tipo(inList:['regular','eletiva'],blank:false)
login(size:3..20,unique:true,blank:false)
senha(size:3..20,blank:false)
ativo(blank:false)
formado(blank:false)
acesso(blank:false)
}

String toString() { nome }

}


valeu
20/10/2008 00:00


0
Não sei se este é seu único erro, mas este seu código está comparando endereços de memória e não o conteúdo da String:

logAnt.toLowerCase() == logNov.toLowerCase()


Tente usar isto no lugar:

logAnt.equalsIgnoreCase(logNov);
10/11/2008 00:00


0
[quote="mfabiop"]Não sei se este é seu único erro, mas este seu código está comparando endereços de memória e não o conteúdo da String:

logAnt.toLowerCase() == logNov.toLowerCase()


Tente usar isto no lugar:

logAnt.equalsIgnoreCase(logNov);
[/quote]

Você pode comparar Strings com o operador == no groovy.
17/11/2008 00:00


0
Obrigado pelas respostas, eu fiz um esquema aq que resolveu meu problema, mas nao descobri o pq ele grava sem eu querer. Já percebi isto em outro caso q eu fiz uma rotina pra salvar alteracoes em um cadastro e esqueci de colocar o save() no final, e mesmo assim ele salvou. Intaum ao colocar os valores na domain ele grava direto ou sei lá.

Mas valeu...
18/11/2008 00:00


0
Se você alterar um objeto persistido ele vai dar update no final da transação mesmo sem chamar o método save.

No seu caso, o problema é que o Grails usa PROPAGATION_REQUIRED nas transações, ou seja, antes de consultar o banco, ele atualiza os banco com as alterações pendentes. Então quando o método validaLogin consulta o banco pra checar o login, o hibernate dá um update na sua tabela de login e grava as suas alterações.

Acho que o mais simples pro seu caso é atribuir os novos valores de Aluno depois da validação. Se você quiser mesmo atribuir os valores do Aluno antes da validação, tem que dar um rollback na transação se a validação falhar.

[]'s

Rodrigo Auler
18/11/2008 00:00


0
Hum agora eu entendi como funciona intaum...

Valeu mesmo..
19/11/2008 00:00



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