Hibernate com relacionamento entre 3 tabelas

3 respostas
M

Pessoal, estou com um caso que não sei como mapear no hibernate annotation:

tbUsuario{idusuario, nome}

tbDepto{iddepto, dsdepto}

tbPerfil{idperfil, dsperfil}

Como o usuário pode pertencer pra mais de um departamento e cada em cada departamento ele pode ter um perfil, criei a seguinte tabela:

tbUsuarioPapel{idusuariopapel, idusuario, iddepto, idperfil}

Como devem ficar as anotações para este caso em cada uma das entidades?

Grato.

3 Respostas

D
tbUsuario N : N tbDepto
tbDepto N : N tbPerfil

A tabela tbUsuarioPapel não faz sentido na forma como está.
Se você quiser descobrir o perfil do usuário, pelo código do usuário (idusuario), você precisa aplicar as regras de normalização de bancos de dados, que nos daria os seguintes desdobramentos

tbUsuario N : N tbDepto
tbUsuario 1 : N tb_usuario_depto
tbDepto 1 : N tb_usuario_depto

tbDepto N : N tbPerfil
tbDepto 1 : N tb_depto_perfil
tbPerfil 1 : N tb_depto_perfil

Onde, tb_usuario_depto poderia ter apenas as colunas tb_usuario_id e tb_depto_id que referenciam idusuario e iddepto respectivamente e, a tabela tb_depto_perfil, apenas tb_perfil_id e tb_depto_id que referenciam idperfil e iddepto.
Num select para obter o código do perfil, com base no id do usuário

SELECT p.idperfil FROM tbPerfil p JOIN tb_depto_perfil tdp WHERE tdp.tb_perfil_id = p.idperfil
JOIN tbDepto d WHERE d.iddepto = tdp.tb_depto_id
JOIN tb_usuario_depto tud WHERE tud.tb_depto_id = d.iddepto
JOIN tbUsuario u WHERE u.idusuario = tud.tb_usuario_id
WHERE
u.idusuario = ?

O mapeamento hibernate, neste caso, permitiria:

@ManyToMany
@JoinTable(name="tb_usuario_depto", joinColumns={@JoinColumn(name="tb_usuario_id", referencedColumnName="idusuario")},
inverseJoinColumns={@JoinColumn(name="tb_depto_id", referencedColumnName="iddepto")}}
private Collection<Departamento> deptos;

Ou algo assim…

L

Na tabela tbUsuarioPapel ficaria assim:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ID_USUARIO", referencedColumnName = "ID", insertable = false, updatable = false)
private Usuario usuario;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ID_DEPTO", referencedColumnName = "ID", insertable = false, updatable = false)
private Depto depto;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ID_PERFIL", referencedColumnName = "ID", insertable = false, updatable = false)
private Perfil perfil;
na tabela tbUsuario:
@OneToMany(mappedBy = "usuario", fetch = FetchType.LAZY)
private List<UsuarioPapel> listaUsuarioPapel;
na tabela tbDepto:
@OneToMany(mappedBy = "depto", fetch = FetchType.LAZY)
private List<UsuarioPapel> listaUsuarioPapel;
e na tabela tbPerfil:
@OneToMany(mappedBy = "perfil", fetch = FetchType.LAZY)
private List<UsuarioPapel> listaUsuarioPapel;

Mas esta não é a melhor maneira de se fazer, quem sabe fazendo e testando você perceba.
Abraço

S

DRSmachado, estou com um problema parecido, pode ajudar?
http://www.guj.com.br/java/293453-duvida-em-mapeamento#1556522

Criado 28 de novembro de 2012
Ultima resposta 14 de fev. de 2013
Respostas 3
Participantes 4