Hibernate relacionamento many to many com atributo [RESOLVIDO]

8 respostas
andreiribas

Estou com um problema com o relacionamento n:m de duas tabelas minhas.

A tabela Produto e a tabela Venda tem o relacionamento n:m. Portanto, criei uma nova tabela com as chaves primárias de Produto e de Venda. Também incluí um atributo quantidade nessa tabela.

Se eu salvo a tabela Venda, o hibernate não salva a tabela produto_venda.
Se eu salvo a tabela Adicionaproduto, acontece o erro
Exception in thread “main” org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): br.uem.din.pes2.loja.modelo.Adicionaproduto

E se eu salvo a tabela Produto, acontece o erro
Exception in thread “main” org.hibernate.PersistentObjectException: uninitialized proxy passed to save()

lembrando que as chaves primárias das tabelas produto e venda são geradas automaticamente

Alguém tem alguma idéia de como resolver isso??

8 Respostas

BrunoAlencar

Grande Andrei.

O Hibernate, sendo uma ferramenta para mapeamento objeto-relacional, terá que trabalhar com duas classes.

A primeira, tera o nome da tabela propria (relacionamento muitos para muitos) seguido de id (identificadora), a segunda terá apenas o nome da tabela propria.

No seu caso, Produtos e Vendas. Então, vejamos. Uma classe terá o nome de protudos_vendas_id (sem método main, apenas construtor), que por sua vez instanciará dois objetos a partir das classes produtos e vendas.

Ex.: private Produtos codprod;
private Vendas codvenda;

Em seguida será feito o encapsulameto desses objetos (criação do métodos setters e getters). Criada a tabela Produtos_Vendas_ID, voce criará a classe Produtos_Vendas. Nessa classe, voce criará um objeto a partir da classe Produtos_Vendas_ID. Pra facilitar a compreensao, de o nome desse objeto de “composite_id” (chave composta), e encapsule-o também.

Feito isso, partirá para o mapeamento. Aqui é que vem o “x” da questão. Criado o novo arquivo xml (produtos_vendas.hbm.xml), primeiro, como voce já deve saber, precisa apontar qual classe será mapeada para a criaçao da tabela no SGBD, certo? Então, aponte a classe Produtos_Vendas (sem o ID). Segundo, informe qual objeto deverá ser a chave composta, sim sim, chave composta e não primária. Utiize o atributo do Hibernate, “composite-id” e informe o objeto criado a partir da classe Produtos_Vendas_ID. Detalhe, informe que esse objeto encontra-se na Classe Produtos_Vendas_ID. Por mais que voce o tenha instanciado dentro de Produtos_Vendas, voce apenas o instanciou. Para ser localizado, deve ser informada a classe Produtos_Vendas_ID. Logo após, vem a parte de informar o relaciomaneto muitos para muitos, propriamente dito. Então, utilize o atributo ", para cada objeto.
Ai, voce deve estar se perguntando: “Mas, não é muitos para muitos, por aqui está muitos para um?”. Muito simples, estamos criando manualmente a tabela própria, ou seja, as classes Produtos e Vendas terão ligação um para muitos com a tabela propria produtos_vendas, o que caracteriza N-N com produtos e vendas.

Assim que receber esse recado… te mando a parte de persistencia. ok?
Valeu…

Qualquer coisa… mande e-mail.
Fui…

BrunoAlencar

Ah sim… outro detalhe.

Na localização dos objetos dentro do atributo “key-many-to-one”, o procedimento é o mesmo da chave composta. Voce deve informar que os objetos foram criados a partir da Classe Produtos e Vendas.OK?
Fui.

andreiribas

BrunoAlencar, obrigado pela resposta velho.
Felizmente, consegui achar um tutorial que explicou exatamente o que eu queria, que é na verdade a mesma coisa que você explicou.

Pra quem estiver interessado, os tutoriais estão em:

Mapeando Associações com Hibernate - Parte 1
http://www.jeebrasil.com.br/mostrar/12

Mapeando Associações com Hibernate - Parte 2
http://www.jeebrasil.com.br/mostrar/14

BrunoAlencar

Grande…
Foi exatamente ai que eu encontrei minhas respostas…

Acredita?
Rs

Mas, valeu !

T

Link interessante para mapeamento objeto-relacional com hibernate:

T

Link interessante para mapeamento objeto-relacional com hibernate:

anakin_

ei galera eu ja tow bringando com esse hibernate ha algumas semanas…
agora tow com a seguinte bronca:

para retornar um objeto de uma tabela comum usa-se essa linha:

Produto p = (Produto) session.get(Produto.class,idproduto);

como o objeto q eu quero é de uma tabela q tem somente duas chaves primarias como pego esses objetos?

Como faço pra pegar os dados dessa tabela gerada do relacionamento?

tipo, eu quero saber quais sao as turmas q o professor “X” estar??

V

Aproveitando o assunto tenho uma dúvida quanto ao servlet da classe associativa. Como faço para os atributos da classes associadas ser vinculada a nova classe???
Ex: tenho duas classes Ordem de Servico e Estoque. Para eu saber que a ordem de servico x terá a peça 1 (exemplo). Como faço para que isso funcione, criei uma nova tabela UniaoOrdemEtq que armazenará esses dados, e já está devidadamente mapeada, mas a pergunta é como será o servlet desta nova classe se terá mesmo?? Pois vejo em muitos tutoriais exemplos de mapeamento de muitos pra muitos sem a utilização de servlet pra isso.

Alguém pode me ajudar

Criado 29 de outubro de 2006
Ultima resposta 1 de jun. de 2010
Respostas 8
Participantes 5