Dúvida JPA - aula Dyego

Java

04/10/2010

Boa tarde a todos!

Tenho conhecimento de JPA passado pelas videos aulas do Dyego.. mas fiquei em dúvida em uma situação:
Na aula onde ensina o @ManyToMany é passado um caso onde a tabela de relacionamento "a tabela do meio" possui somente os ids das outras duas tabelas do relacionamento. Gostaria de saber como mapear isso, se além dos ids, a tabela de relacionamento também conter outros campos, bem como como proceder na hora do seu Persist....

valew! t+
Skytrack Ltda

Skytrack Ltda

Curtidas 0

Respostas

Davi Costa

Davi Costa

04/10/2010

Tem que rever um pouco sua modelagem,
porque para o relacionamento ManyToMany, as entidades que realmente contam são as extremidades, a
tabela do meio simplesmente só serve para fazer o relacionamento,
caso queira manter algum atributo além dos id(s), seria melhor manter em uma das duas tabelas.
Att Davi
GOSTEI 0
Skytrack Ltda

Skytrack Ltda

04/10/2010

Bom.. na verdade, eu acho que a modelagem está correta, só não sei como mapeá-la, e como proceder na hora de persistir a tabela do meio. Segue abaixo:


Máquinas
id
descrição
..
..
..


Máquinas_peças
id_Máquina
id_Peça
PróximaDataTrocaPeça



Peças
id
descrição
..
..
..

1 Máquina possui várias peças e essa peça pode estar em várias máquinas (n:n)


Se eu não tivesse o atributo PróximaDataTrocaPeca na tabela de relacionamento (Máquinas_peças) eu usaria @ManyToMany pois não seria preciso criar esta classe, no mapeamento já é informado o nome da tabela e fica tudo certo, mas como faço quando tenho atributos além dos IDs ?
GOSTEI 0
Julio Cesar.

Julio Cesar.

04/10/2010

Um relacionamento de n:n   como exemplo: muitos usuarios para muitos grupos   Grupo.class @ManyToMany
    @JoinTable(name ="GrupoUsuario", <--tabela do meio
    joinColumns = @JoinColumn(name="id_grupo" , referencedColumnName="id_na_class_grupo"),
    inverseJoinColumns = @JoinColumn(name="id_usuario", referencedColumnName="id_na_class_usuario"))  public List<Usuario> usuario;     Usuario.class @ManyToMany
    @JoinTable(name ="tabela_do_meio", <--tabela do meio
    joinColumns = @JoinColumn(name="id_usuario" , referencedColumnName="id_na_class_usuario"),
    inverseJoinColumns = @JoinColumn(name="id_grupo", referencedColumnName="id_na_class_grupo")) public List<Grupo> grupo;       É essa a dúvida?   att, Julio
GOSTEI 0
Skytrack Ltda

Skytrack Ltda

04/10/2010

Não Júlio... dessa forma já fiz e deu certo... a minha "tabela_do_meio" possui mais atributos, e não apenas os IDs da relação... aí fica diferente do que vc passou, não é?
GOSTEI 0
Julio Cesar.

Julio Cesar.

04/10/2010

Sim, bom se não estou enganado tem uma outra forma eu vou ver aqui e te retorno Ok? Passe os atributos das tabelas para eu ver no que posso lhe ajudar!!!   Att, Julio
GOSTEI 0
Davi Costa

Davi Costa

04/10/2010

Desculpe se eu me expressei mal,
mas cara então relacionamento entre as extremidades não é manyToMany,
elas se relacionam somente com a tabela do meio com dois
OneToMany.
Ou é ManyToMany com duas tabela e uma tabela para fazer esse relacionamento,
ou é dois OneToMany para essa tabela central. Essa tabela pode até ter o embedable id,
tendo dois objetos das tabelas extremas. O hibernate é muito bom abstrai 95% da implementação,
mas temos que ter alguns cuidados Java é orientado a objetos, mas os banco são relacionais.
Espero ter ajudado
Att Davi
GOSTEI 0
Skytrack Ltda

Skytrack Ltda

04/10/2010

Davi, ajudou sim cara... e Julio, to esperando um retorno teu então cara... e quanto aos atributos, os demais não os tenho aqui agora, mas não são relevantes... o que eu preciso é fazer uma distinção das peças de acordo com a máquina que elas estão justamente porque a data de troca dela é diferente em cada máquina, os atributos relevantes estão no post.
GOSTEI 0
Davi Costa

Davi Costa

04/10/2010

Caros,

conseguiram alguma solução?
Esses dias me deparei com algo parecido.. O que fiz mantive o ManyToMany e a tabela de relaciomento simplesmente só usada para esse fim. E outra que guarda outros atributos que não eram somente os ids das entidades dos extremos com dois relaciomentos OneToMany, nessa mesma entidade que guarda outros atributos.
Na verdade dessa forma nem precisaria mais do relacionamneto ManyToMany entre as entidades dos extremos, então o retirei. Não sei se atenderia seu caso, mas meu caso funcionou tranquilamente, com a modelagem igualzinha a que vc descreveu.
Mas se houver outra forma mais elegante de fazer, até outro colaborador do fórum citou antes que ia dar uma olhada. Ficaria muito grato em saber.

Att Davi
GOSTEI 0
Dyego Carmo

Dyego Carmo

04/10/2010

Rapaziada , neste caso não tem, como fazer automatico , quando voce possui algum campo alem das chaves de ligacao na tabela do meio voce vai precisar fazer algo @manytone e @onetomany , utilizando uma nova entidade para esta tabela !

GOSTEI 0
Skytrack Ltda

Skytrack Ltda

04/10/2010

Vou mexer nisso exatamente hoje ... 
Li mais sobre o assunto e até então decidi que vou fazer assim:


tabA
id
descricao

tabMeio
id
idTabA
idTabB
outroAtributos

tabB
id
descricao


Vou deixar como PK a minha tabMeio.id, auto incremento e vou relacionar as outras com idTabA e idTabB..  usando @OneToMany e @ManyToOne..

Vou criar o ID como PK na tabela do meio para não ter que utilizar IdTabA e idTabB como chave composta, evitando usado de @Embedded Id..

Amanhã posto o resultado..

abraços e valew a ajuda
GOSTEI 0
Skytrack Ltda

Skytrack Ltda

04/10/2010

aqui onde tirei a idéia:

http://alinhavado.wordpress.com/tutoriais/de-many-to-many-para-many-to-one-com-jpa/
GOSTEI 0
Dyego Carmo

Dyego Carmo

04/10/2010

Funcionou ?

GOSTEI 0
Skytrack Ltda

Skytrack Ltda

04/10/2010

Pessoal , desculpem-me pela demora. Dyego, funcionou sim, fiz exatamente como no post que eu citei.
obrigado a todos.
GOSTEI 0
POSTAR