Dúvida no mapeamento de classes hibernate

1 resposta
jherimum

galera desculpe pelo topico anterior. naum consegui deletar o topico.

Conhecedores de hibernate, preciso da ajuda de vocês.

O lance é o seguinte:

tenho as seguintes tabelas:

Tabela_Usuario:

  • usuario_id (pk)
  • usuario_nome

Tabela_Perfil

  • perfil_id (pk)
  • perfil_nome

Tabela_usuario_perfil:

  • usuario_peril_id (pk)
  • usuario_id (fk)
  • perfil_id (fk)
  • usuario_perfil_data_inicial
  • usuario_perfil_data_final (nullable)

Tenho as seguintes entidades modeladas:

@Entity

@Table(name=Tabela_Usuario)

class Usuario{
@id
@column(name="usuario_id")
private Long id;

@column(name="usuario_nome")
private String nome;

????????????
private Perfil perfilAtual

}

@Entity

@Table(name=Tabela_Usuario)

class Perfil{

@id

@column(name=perfil_id)

private Long id;
@column(name="perfil_nome")
private String nome;

?????????????????/	
List<Usuario> usuariosAtuais;

}

Eu gostaria de ter na entidade usuario uma referencia para o perfil atual do usuario,
e na entidade perfil a lista de usuarios atuais deste perfil. Tanto perfil atual, e
usuarios atuais sao obtidos atraves da tabela Tabela_Usuario_perfil, quando a coluna
usuario_perfil_data_final for igual a null.

Não to conseguindo uma maneira de fazer esse mapeamento.
Alguem poderia me ajudar. de preferencia fazendo o mapeamento atraves de anotações.
Obrigado

1 Resposta

jmoreira

Cara, o relacionamentos no Hibernate deve ser estratégicamante pensado em cima da sua regra de negócio. Assim, precisa-se saber:

  1. Você está modelando suas classes TOP => DOWN ou DOWN =>TOP?
  2. 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.
  3. 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&lt;Perfil&gt; perfis= new ArrayList&lt;Perfil&gt;();
        // 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&lt;Usuario&gt; usuarios= new ArrayList&lt;Usuario&gt;();
        // 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.

Criado 3 de abril de 2008
Ultima resposta 4 de abr. de 2008
Respostas 1
Participantes 2