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…