Update ao Inves de Insert
07/07/2017 09:53
0
Amigos,

Tenho o seguinte problema, o metodo salvar do meu controller esta realizando um update ao inves de insert. Estou utilizando o seguinte codigo no controller.: 

?package br.net.globotecnologia.controller
import br.net.globotecnologia.domain.Ocorrencia
import br.net.globotecnologia.domain.Contrato

class OcorrenciaController {
def index() { }
 
def lista(){
 
  def ocorrencias = Ocorrencia.findAll("From Ocorrencia o where o.contrato.numero =:numeroContrato", [numeroContrato:params.numeroContrato.toInteger()]) 
  
  [ocorrencias : ocorrencias, totalOcorrrencias : ocorrencias.size(), panelTitulo:'Ocorrencias do Contrato']
}
 
def novo(){
  [ocorrencia:new Ocorrencia(params) ,  panelTitulo:'Nova Ocorrencia', contrato:Contrato.findByNumero(params.numeroContrato) ]

 
def salvar(Ocorrencia ocorrencia, Contrato contrato){
  
  ocorrencia.contrato = Contrato.findByNumero(contrato.numero)
  if(ocorrencia.save(flush:true, failOnError:true)){
flash.message = "nova ocorrencia adicionada com sucesso"
redirect action:'lista', controller:'contrato'
  }
}
}

Ja tenho 4 Ocorrencias salvas na base de dados, e o comportamento da aplicação com esse código é pegar a primeira ocorrencia e realizar o update. Creio que isto deva ser algum comportamento do GORM. No entanto, existe alguma explicação para isto ocorrer, visto que se trata de uma nova instancia de objeto. 
Tags: Grails


0
Dica : nessa linha é bem mais "limpo" usar isso def ocorrencias = Ocorrencia.findAllWhere(contrato :Contrato.findByNumero(params.numeroContrato.toInteger())])

?
def salvar(Ocorrencia ocorrencia, Contrato contrato){
  
  ocorrencia.contrato = Contrato.findByNumero(contrato.numero)
  if(ocorrencia.save(flush:true, failOnError:true)){
flash.message = "nova ocorrencia adicionada com sucesso"
redirect action:'lista', controller:'contrato'
  }
}
Por que vc da um find no contrato se esta enviando como parametro um objeto do tipo contrato?
Tipo nao vou dizer que o gorm  não esteja bugado , mais   pra ir mais a fundo tu deveria debuggar tudo com o o log. Talvez em  algum momento  chegue no metodo salvar  um array e ele   salve   a primeira posição. Isso nunca ocorreu comigo.  nem nas versoes 2.x nem nas 3.x
?
10/07/2017 10:09


0
ola William. Na realidade, eu realmente estou passando o objeto contrato no metodo novo(), porém quando o recupero no metodo salvar, ele nao vem preenchido. Entao acabo tendo que buscar novamente o contrato. Por incrivel que pareça esta situação ocorreu quando o código estava desta maneira que postei, porém quando rodei o projeto em outro momento ele ja dava problema e nem exibia a pagina normalmente. 

Coloquei este mesmo codigo fonte no eu github.: https://github.com/mferreira17/gestor

Se puder dar uma olhada :-)
10/07/2017 11:23


0
?    def salvar(Ocorrencia ocorrencia, Contrato contrato){

        if(contrato) {
           ocorrencia.contrato = Contrato.get(params.idContrato)
           println "Numero contrato .: ${contrato.numero}"
        }

        if(ocorrencia.save(flush:true, failOnError:true)){
            flash.message = "nova ocorrencia adicionada com sucesso"
            redirect action:'lista', controller:'contrato'
        }
    }

na view vc tem um  type hidden com name id!!! quando vc da o new Ocorrencia(params) ele pegava o id  do contrato que era o 1 ai sempre  dava update  no com id 1!!! no novo  tire o params  do new [code]Ocorrencia
() e na view renomeie  a  o name="id" para name="idContrato"
[/code]
10/07/2017 15:54


0
zoou  todo o posto mais acho que da pra entender né!!!

basicamente  o new Ocorrencia() que vc enviava pra view pega o name="id" como id dele  e la continha  a id do contrato
10/07/2017 16:01


0
Fale William, de fato nao atentei pra isso. Creio que isto va resolver o problema do update (removi o campo id já que ele nao era necessario dado o escopo da página). No entanto, meu problema agora é com relação ao objeto contrato que volta completamente nulo, sendo que ja o envio preenchido na chamada do metodo novo. Olha só:

def novo(){
        
        [ocorrencia:new Ocorrencia(),  panelTitulo:'Nova Ocorrencia', contrato: Contrato.findByNumero(params.numeroContrato) ]
    } 
    
    def salvar(Ocorrencia ocorrencia, Contrato contrato){
        
        if(contrato){
            ocorrencia.contrato = contrato
        }
        
        
        if(ocorrencia.save(flush:true, failOnError:true)){
            flash.message = "nova ocorrencia adicionada com sucesso"
            redirect action:'lista', controller:'contrato'
        }
    }


Será que isto ocorre devido ao escopo do controlador não ser do tipo singleton ?
11/07/2017 10:53


0
por default   todo   controller é prototype  vc pode mudar isso assim :
static scope = "singleton"
mais nao sei se esse é o problema , mas  não custa tentar
11/07/2017 12:37


0
mesmo com o codigo ajsutado, nao consigo receber o objeto contrato da view. O codigo esta semelhante acima. Nao e preciso mudar o escopo pra singleton, visto que os controladores todos ja tem esse escopo.
12/07/2017 12:33



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