Relacionamento ManyToMany

Bom dia senhores, tenho uma duvida… gostaria de saber o que poderia ser feito para facilitar esse relacionamento entre minhas tabelas…
Problema:
tenho uma TB_USUARIO e TB_PAPEL = relacionamento ManyToMany
tenho uma terceira TB_PROJETO
para simplificar criei uma tabela intermediaria TB_PAPEL_USUARIO para fazer o relacionamento entre TB_USUARIO e TB_PAPEL e depois sucessivamente unir essa tabela com projeto
na tabela TB_PAPEL_USUARIO fiz uma PK onde tem o id do usuario e do papel

@EmbeddedId private UsuarioPapelPK usuarioPapelPK;

agora fiz a referencia na minha TB_USUARIO

@OneToMany(mappedBy = "usuarioPapelPK.idUsuario", fetch = FetchType.EAGER, cascade = CascadeType.ALL) private List<UsuarioPapel> listUsuarioPapeis;

e esta acontecendo o seguinte para adicionar novos usuarios papeis dentro de um usuario é facil simplismente seto uma pk dentro do meu usuarioPapel jogo na lista do usuario e salvo o usuario

List<UsuarioPapel> usuariosPapeis = new ArrayList<UsuarioPapel>(); for (Papel papel : listPapeis.getTarget()) { UsuarioPapelPK usuarioPapelPK = new UsuarioPapelPK(usuario.getId(), papel.getId()); usuariosPapeis.add(new UsuarioPapel(usuarioPapelPK)); } usuario.setListUsuarioPapeis(usuariosPapeis);

o problema é quando eu tento tirar um PapelUsuario da lista.
Eu imagino que se minha lista tinha 3 papeis usuarios e agora tem apenas dois o relacionamento entre elas deveria entender q eu quero excluir um usuarioPapel (PK = idUsuario com idPapel) do banco, e não é isso q acontece, eu tinha um usuario papel da lista salvo o usuario e quando carrego novamente esta la ainda os usuarios papel anteriores.

sera q o relacionamento entre elas esta errado…
alguem pode me ajudar???
Obrigado

Olá.
Aparentemente teu relacionamento tá correto,posta o código da exclusão pra gente dar uma olhada.

Justamente esse o que eu quero saber, eu não tenho uma exclusão para usuario_papel eu penso q o relacionamento deveria desvincular automaticamente.
certo?

O que vc chama de desvincular automaticamente?

Faz o seguinte… na sua tabela tb_usuarioPapel primeiro vc tira este prefixo tb que é escroto…
depois vc coloca a pk dela uma pk normal sem nenhum relacionamento tanto de usuario quanto papel e coloca 2 fks uma referente a tabela usuario e outra referente a papel
e deixa este id autoincrement ou cria uma sequence para ele, dai vc não terá este problema…

Bom de acordo com oq eu li aqui aqui, A noção de um pai e um filho é que um tome conta do outro certo, na pratica isso quer dizer q eu precisaria de menos linhas de codigo, para gerenciar um relacionamento entre um pai e um filho, pois algumas coisas podem ser tratadas automaticamente.

por exemplo:

[code]Item newItem = new Item();
Bid newBid = new Bid();

new Item.addBid(newBid);//definir ambos os lados da associação

session.save(newItem);
session.save(newBid); // CHAMADA REDUNDANTE[/code]

logo se ele faz isso automaticamente para salvar deve fazer para excluir sem que eu precise excluir um por um…

leia ali em cima o que eu acabei de editar… tente evitar chaves compostas isto quase sempre causa problemas nos mecanismos de persistencia e não deixa a coisa tão transparente como deveria ser…

[quote=luistiagos]uma pergunta Usuario e Papel é NxN? muitos papeis podem ter muitos usuários e muitos usuários podem ter muitos papéis? O que vc quer fazer?

e outra coisa meio fora de contexto pq utilizar TB_ na frente de uma tabela? isto é meio escroto não acha? [/quote]

Bom em relação ao nome q eu tenho na minha tabela eu imagino que como o projeto é meu eu possa colocar o nome q eu quizer na minha tabela,
agara relacionado ao papel_usuario eu quero unir um papel com um usuario e depois unir essa ligação com um projeto…

[quote=luistiagos]leia ali em cima o que eu acabei de editar… tente evitar chaves compostas isto quase sempre causa problemas nos mecanismos de persistencia e não deixa a coisa tão transparente como deveria ser…
[/quote]

ok muito obrigado, é que realmente eu achei necessario

estamos meio desincronizados nos posts :lol:

mas faça o seguinte coloque um id com uma sequence que não tem nada haver com usuario e nem papel na sua tabela tb_usuariopapel e 2 fks uma para usuario e outra pra papel… dai a persistencia e o delete vc faz normalmente como se fosse uma tabelá normal (com a inserção de um id unico nesta tabela ela será uma tabela comum…)

[quote=luistiagos]estamos meio desincronizados nos posts :lol:

mas faça o seguinte coloque um id com uma sequence que não tem nada haver com usuario e nem papel na sua tabela tb_usuariopapel e 2 fks uma para usuario e outra pra papel… dai a persistencia e o delete vc faz normalmente como se fosse uma tabelá normal (com a inserção de um id unico nesta tabela ela será uma tabela comum…)[/quote]

mas acontece q anteriormente era assim, eu tinha minha tabela usuario_papel com seu id normal e a fk do usuario e do papel, acontece q quando quando meu usuario tem uma chave primaria eu posso ter o mesmo usuario vinculado a varios mesmos usuario_papel

exemplo

USUARIO1 - PAPEL_USUARIO1
USUARIO1 - PAPEL_USUARIO1

sendo que PAPEL_USUARIO1 pode ter 2 ids diferentes.
eu me fiz entender?

[quote=Wiliam Witter][quote=luistiagos]estamos meio desincronizados nos posts :lol:

mas faça o seguinte coloque um id com uma sequence que não tem nada haver com usuario e nem papel na sua tabela tb_usuariopapel e 2 fks uma para usuario e outra pra papel… dai a persistencia e o delete vc faz normalmente como se fosse uma tabelá normal (com a inserção de um id unico nesta tabela ela será uma tabela comum…)[/quote]

mas acontece q anteriormente era assim, eu tinha minha tabela usuario_papel com seu id normal e a fk do usuario e do papel, acontece q quando quando meu usuario tem uma chave primaria eu posso ter o mesmo usuario vinculado a varios mesmos usuario_papel

exemplo

USUARIO1 - PAPEL_USUARIO1
USUARIO1 - PAPEL_USUARIO1

sendo que PAPEL_USUARIO1 pode ter 2 ids diferentes.
eu me fiz entender?[/quote]
Bom,vou dizer a forma que EU faço e funciona;

  • No banco crio a entidade associativa com as duas FK e defino um UNIQUE com elas;
  • No JPA trabalho com @EmbeddedId(não tive dificuldades quanto a isso);

[quote=Wiliam Witter][quote=luistiagos]estamos meio desincronizados nos posts :lol:

mas faça o seguinte coloque um id com uma sequence que não tem nada haver com usuario e nem papel na sua tabela tb_usuariopapel e 2 fks uma para usuario e outra pra papel… dai a persistencia e o delete vc faz normalmente como se fosse uma tabelá normal (com a inserção de um id unico nesta tabela ela será uma tabela comum…)[/quote]

mas acontece q anteriormente era assim, eu tinha minha tabela usuario_papel com seu id normal e a fk do usuario e do papel, acontece q quando quando meu usuario tem uma chave primaria eu posso ter o mesmo usuario vinculado a varios mesmos usuario_papel

exemplo

USUARIO1 - PAPEL_USUARIO1
USUARIO1 - PAPEL_USUARIO1

sendo que PAPEL_USUARIO1 pode ter 2 ids diferentes.
eu me fiz entender?[/quote]

acho que vc não entendeu…