Como mapear uma FK composta com mais de 2 chaves!
03/04/2008 00:00
0
Ola pessoal,

Estou tendo uma dúvida que preciso fazer um mapeamento na minha classe de uma chave estrangeira que é composta de 3 chaves!

Gostaria de compartilhar o código aqui para discutirmos e conseguir uma solução! Até 2 chaves eu consegui facilmente, mas nesse caso está complicado para mim.

Dessa forma, tenho as seguintes classes:

*EmpresaSegmentoProduto :



class EmpresaSegmentoProduto implements Serializable{
Segmento segmento
Pais pais
int percentFaturamento
String dataInicio
Empresa empresa

static belongsTo = EmpresaInstituicao

static hasMany = [empresaProdutos:EmpresaProduto]

static constraints = {
segmento(nullable:false)
pais(nullable:false)
percentFaturamento(min:0, max:100, blank:false)
dataInicio(maxSize:6, blank:false)
empresa(nullable:false)
}

static mapping = {
table('tbtradesegmentoproduto')
version(false)
id composite:['segmento','empresa']
columns {
empresa(column:'idtrade')
segmento(column:'cosegmento')
pais(column:'idpais')
percentFaturamento(column:'pefaturamento')
dataInicio(column:'aamminicio')
empresaProdutos(composite:['idtrade','cosegmento','coproduto'])
}
}

}


*EmpresaProduto:


class EmpresaProduto implements Serializable {
Empresa empresa
Segmento segmento
Produto produto

static belongsTo = EmpresaSegmentoProduto

static constraints = {
empresa(nullable:false)
produto(nullable:false)
segmento(nullable:false)
}

static mapping = {
table('tbtradeproduto')
version(false)
id composite:['empresa','segmento','produto']
columns {
empresa(column:'idtrade')
segmento(column:'cosegmento')
produto('coproduto')
}
}

String toString(){"${this.produto}"}
}


Como vocês podem ver acima nas classes eu preciso mapear a chave estrangeira na classe EmpresaSegmentoProduto para a classe EmpresaProduto. Vimos também o tipo de relacionamento, que é um-para-muitos.

Infelizmente, não tenho otido sucesso em minhas tentativas e lendo a documentação do Grails, incluindo o GORM.

Gostaria muito da ajuda de vocês, que estou literalmente parado por causa disso no meu projeto.

Muito obrigado pessoal!

Atenciosamente.
Tags: Grails


0
entao..eu nao posso te ajudar, mas vi que voce disse que conseguiu fazer o mapeamento com 2 chaves e gostaria de saber de saber se voce pode me dar uma ajuda. Estou tentando fazer mapeamento com 2 chaves e esta dando erro na hora de inserir e de ler do banco. A classe esta assim:

class Cadastro_outros implements Serializable{

String nome
String nomeMae
String identificacao
String sexo
String email
String telefone
Integer cpf
Orgaos orgao
Vinculo vinculo
Situacao situacao
Date data_nascimento

static belongsTo = Vinculo,Orgaos,Situacao

static constraints = {
identificacao(maxSize:10,blank:false,unique:'orgao')
nome(maxSize:60,blank:false)
sexo(inList:["Masculino","Feminino"])
cpf(nullable:false)
email(maxSize:50,blank:false,email:true)
telefone(maxSize:15,blank:false)
nomeMae(maxSize:50,blank:false)
data_nascimento(nullable:false)
}

static mapping = {
table 'cadastro_outros'
version false
id composite:['orgao', 'identificacao']
columns{
orgao column:'orgao'
vinculo column:'vinculo'
situacao column:'situacao'
}
}

}

o erro que dah eh este: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1; nested exception is org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1

Quando coloquei o "id composite" ele pediu pra colocar "implements Serializable". Fiz isso, mas nao fiz nenhum outro mapeamento do hibernate, eh necessario? E nao dah pra usar o metodo "get()", pois vai como argumento o id, e como este id eh composto, nao sei o que colocar nos parametros.


desde ja agradeço,

abraços
13/06/2008 00:00


0
Ola,

Olhando a sua classe verifiquei que você está mapeamento apenas alguns campos. Nesse sentido acredito que voce deve mapear para todos os campos. Pelo fato de não estar mapeando pode estar ocorrendo algum erro.

Acredito que o banco não foi gerado pelo Grails, que também ele não estaria usando chave composta. Portanto, verifique novamente, mapeando todos os campos corretamente com a tabela e tente salvar.

Com relação ao meu problema o Grails ainda não suporta um mapeamento de uma classe que possui chaves compostas, acima de 2 campos. Somente bia notação hibernate poderia ser feito isso.

Qualquer avanço me diga.

Abs.
Sérgio Teixeira.
13/06/2008 00:00


0
Quanto ao fato de não conseguir recuperar o objeto, nesse caso sugiro que use os metódos Gorm . Nesse caso para procurar um elemento especifico, como, por exemplo:



def cadastroOutros = Cadastro_outros.findByOrgaoAndIdentificacao(orgao, '1');

13/06/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