Hibernate relacionamento many to many com atributo [RESOLVIDO]  XML
Índice dos Fóruns » Ferramentas, Frameworks e Utilitários
Autor Mensagem
andreiribas
JavaEvangelist
[Avatar]

Membro desde: 30/04/2006 10:43:13
Mensagens: 478
Localização: Curitiba - PR
Offline

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??

SCJP 6.0
OCE JSP and Servlet Developer, JEE 6
[MSN]
BrunoAlencar
HelloWorld
[Avatar]

Membro desde: 27/07/2006 13:32:14
Mensagens: 10
Localização: Ji-Paraná/RO
Offline

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 <key-many-to-one name="nome do objeto" class="nome da classe"/>", 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...

Bruno Alencar
[MSN]
BrunoAlencar
HelloWorld
[Avatar]

Membro desde: 27/07/2006 13:32:14
Mensagens: 10
Localização: Ji-Paraná/RO
Offline

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.

Bruno Alencar
[MSN]
andreiribas
JavaEvangelist
[Avatar]

Membro desde: 30/04/2006 10:43:13
Mensagens: 478
Localização: Curitiba - PR
Offline

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

SCJP 6.0
OCE JSP and Servlet Developer, JEE 6
[MSN]
BrunoAlencar
HelloWorld
[Avatar]

Membro desde: 27/07/2006 13:32:14
Mensagens: 10
Localização: Ji-Paraná/RO
Offline

Grande...
Foi exatamente ai que eu encontrei minhas respostas...

Acredita?
Rs


Mas, valeu !

Bruno Alencar
[MSN]
thiagoprocaci
Thread.start()

Membro desde: 23/04/2009 23:00:37
Mensagens: 35
Offline

Link interessante para mapeamento objeto-relacional com hibernate:

http://thiagoprocaci.blogspot.com/2009/04/mapeamento-objeto-relacional-com.html

Thiago Baesso Procaci
http://thiagoprocaci.blogspot.com/
[Email] [WWW]
thiagoprocaci
Thread.start()

Membro desde: 23/04/2009 23:00:37
Mensagens: 35
Offline

Link interessante para mapeamento objeto-relacional com hibernate:

http://thiagoprocaci.blogspot.com/2009/04/mapeamento-objeto-relacional-com.html

Thiago Baesso Procaci
http://thiagoprocaci.blogspot.com/
[Email] [WWW]
anakin__
What is classpath?
[Avatar]

Membro desde: 09/06/2009 09:08:36
Mensagens: 9
Offline

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??
[Email]
vandinho
Thread.start()

Membro desde: 16/10/2009 13:25:10
Mensagens: 27
Offline

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

do amigo Vanderson
[Yahoo!] [MSN]
 
Índice dos Fóruns » Ferramentas, Frameworks e Utilitários
Ir para:   
Powered by JForum 2.1.8 © JForum Team