Hibernate - como procuro um objeto no banco pela chave primaria sendo ela composta

4 respostas
pimentaft

Eu estou fazendo um cadastro de uma sala de aula. As classes modelo:

public class Sala{//sem os gets e sets, bem resumido
   @id
   private String codigo;
   private String descrição;
   @id
   @manytoone
   private Andar andar;
   @id
   @manytoone
   private TipoSala tiposala;
}
public class Andar{
   @id
   @manytoone
   private  Pavimento pavimento
    @id
    @manytoone
    private Bloco bloco
}
Percebe-se que existe 2 atributos que precisam ser preenchidos completamente antes de salvar(andar e tiposala), e o que eu tenho de informação deles que vem do formulario são apenas os códigos de andar e tiposala.

Sem o hibernate, eu faria o seguinte:

-Criaria um dao para buscar pelo código;

-Preencheria um objeto(Andar andar)

-Após setaria no objeto SALA para poder salvar.

O metodo ficaria assim:

public Andar findByPrimaryKey(Pavimento pavimento,Bloco bloco){
   //restante do metodo
return andar;
}

A minha dificuldade está aqui, com hibernate para fazer esse tipo de busca por chave primária composta:

Eu sei que, se fosse apenas uma chave, eu faria assim:

public T procura(int id) {
       return (T) session.load(this.classe, id);
}

Eu andei pesquisando no google, vi algo como uma outra configuração na classe ANDAR, tipo, criando uma nova classe para colocar somente as chaves primarias compostas.Algo do tipo:

public class AndarPK{
   private Pavimento pavimento;
   private Bloco bloco;
//gets e sets
}

e na classe andar ficaria:

public class Andar{
   private AndarPK id;
   //gets e sets
}

Alguem poderia me ajudar a desvendar a maneira mais eficaz de fazer esse tipo de busca???

4 Respostas

g4j

A tua chave primária tem que implementar Serializable. A classe Integer implementa Serializable!

API: http://www.hibernate.org/hib_docs/v3/api/org/hibernate/Session.html#load(java.lang.Class,%20java.io.Serializable)

Então, tua chave, no caso a classe composta tem que implementar Serializable,

public class User {
      private UserPk id;
      private String name;

      //gets/sets omitidos
}

public class UserPk implements Serializable {
      private Integer cpf;
      private Sring cep;

      //gets/sets omitidos

}
public T procura(Serializable id) {  
           return (T) session.load(this.classe, id);  
    }
pimentaft

Vlw msm, vou fazer… :smiley:

Me diz soh mais uma coisa, nesta classe cliente q vc me mandou, se caso as chaves fossem do tipo objeto, como seria???

g4j

pimentaft:
Vlw msm, vou fazer… :smiley:

Me diz soh mais uma coisa, nesta classe cliente q vc me mandou, se caso as chaves fossem do tipo objeto, como seria???

Nunca fiz algo assim. mas acho que cada uma delas teria que ter uma chave interna.

pimentaft

Eu tentei fazer como vc me explicou.Veja como ficou:

public class Andar implements Serializable{
	@EmbeddedId
	private AndarPK id;
	
	@ManyToOne
		@JoinColumn(name="codbloco")
	private Bloco bloco;
	
	@ManyToOne 
		@JoinColumn(name="codpavimento")
	private Pavimento pavimento;
	//omitidos gets e sets
public class AndarPK implements Serializable{
	private int codPavimento;
	private String codBloco;
...

Para fazer a busca seria:

Andar andar = (Andar) new Dao(sessao,Andar.class).procura(andarpk);

e no dao:

public T procura(Serializable id) {     
	       return (T) session.load(this.classe, id);     
	}

Seria isso???

Criado 8 de outubro de 2008
Ultima resposta 8 de out. de 2008
Respostas 4
Participantes 2