Update ao Inves de Insert
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 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.
Dica : nessa linha é bem mais "limpo" usar isso def ocorrencias = Ocorrencia.findAllWhere(contrato :Contrato.findByNumero(params.numeroContrato.toInteger())])
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
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 :-)
?    def salvar(Ocorrencia ocorrencia, Contrato contrato){
if(contrato) {
ocorrencia.contrato = Contrato.get(params.idContrato)
println "Numero contrato .: ${contrato.numero}"
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"
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
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ó:
[ocorrencia:new Ocorrencia(),  panelTitulo:'Nova Ocorrencia', contrato: Contrato.findByNumero(params.numeroContrato) ]
if(contrato){
ocorrencia.contrato = contrato
Será que isto ocorre devido ao escopo do controlador não ser do tipo singleton ?
por default todo controller é prototype vc pode mudar isso assim :
mais nao sei se esse é o problema , mas não custa tentar
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.
Bom , a ultima pergunta que deixei neste post , ficou em aberto. Consegui matar o problema do update, mas nao consegui fazer o objeto contrato vir preenchido. Se alguem puder ajudar, o codigo fonte esta no github