Cara, o relacionamentos no Hibernate deve ser estratégicamante pensado em cima da sua regra de negócio. Assim, precisa-se saber:
- Você está modelando suas classes TOP => DOWN ou DOWN =>TOP?
- Quem irá fornecer a chave primária: o BD ou a regra de negócio? Se for o BD (mais comum) você está esquecendo de usar o GeneratedValue.
- O sistema é WEB ou Desktop?
Dependendo da resposta de cada pergunta acima, outras perguntas virão a tona e você usará estratégias diferentes para trabalhar com o hibernate, o qual por exemplo, inclui usar mais ou menos classes de negócio e, consequentemente, mais ou menos relacionamentos, mais ou menos mapeamentos e por ai vai…
Isso que você está precisando fazer é bastante avançado. Não dá pra sair fazendo sem ter um livro como este do lado. Desse modo, vou lhe mostrar apenas uma parte da coisa para que você possa ter uma idéia de como prosseguir. Sugiro fortemente que adquira o livro ou até mesmo faça um curso adequado. Os cursos da Caelum é recomendado. Não estou fazendo propaganda. Fiz o curso e recomendo.
Faça assim:
@Entity(name="USUARIO")
public class Usuario implements Serializable
{
@Id
@GeneratedValue
private Long id;
private String nome;
private String senha; // A regra de negócio terá senha?
private Date dataIncial;
private Date dataFinal;
@ManyToMany(fetch=FetchType.LAZY)
@JoinTable(name="USUARIO_PERFIL", joinColumns=@JoinColumn(name="USUARIO_ID",referencedColumnName="ID"),
inverseJoinColumns=@JoinColumn(name="PERFIL_ID", referencedColumnName="ID"))
private List<Perfil> perfis= new ArrayList<Perfil>();
// gets e sets
}
@Entity(name="PERFIL")
public class Perfil implements Serializable
{
@Id
@GeneratedValue
private Long id;
private String nome;
@ManyToMany(mappedBy="perfis", fetch=FetchType.LAZY)
private List<Usuario> usuarios= new ArrayList<Usuario>();
// gets e sets
}
Pelo que entendi do seu sistema, um usuário pode ter N perfis e um Perfil fatalmente terá N usuários. Assim temos um relacionamento N<=>N. Relacionamentos desse tipo você deve utilizar a anotação @ManyToMany, como apresentado. No exemplo, o hibernate automáticamente criará a tabela "USUARIO_PERFIL", com duas colunas: USUARIO_ID e PERFIL_ID. Quando você fizer usuario.getPerfis(), o que você terá? R: Todos os perfis daquele usuario. O inverso também é válido: perfil.getUsuarios(); você terá todos os usuários daquele prefil. Quando você diz:
Isso não procede. Os campos dataInicial e dataFinal NÃO pode estar na tabela USUARIO_PERFIL, uma vez que esta tabela é produto do relacionamento entre as duas entidade principais. Por isso que os dois campos estão na tabela USUARIO. Se isso não fizer sentido, você deverá rever os conceitos da sua regra de negócio.
Quanto a questão do Perfil Atual, isso dependerá da sua regra de negócio. Se for via WEB, quando o usuário “LOGAR” no sistema, a sua regra de negócio identificará automaticamente o usuário e fará a validação do perfil que o mesmo deve ter para acessar os modulos do sistema. Ai basta guarda o login e o pefil do usuario na sessão. Outra estratégia seria deixar o próprio servidor de aplicação fazer a validação do USUARIO X PEFIL X PERMISSÃO. Neste último caso, o próprio servidor poderá fornecer programaticamente quem é o usuário e qual é o perfil atual do mesmo. Em fim…muitos detalhes devem serem observados antes de pensar nos relacionamentos do hibernate.