Select com chave composta [RESOLVIDO]

2 respostas
G

Opa galera, beleza?
Estou com algumas dúvidas.

Eu tenho uma entidade e esta entidade possui uma chave composta.
Li aqui como fazer (criar uma classe e anotar ela como @Embeddable).

Primeira dúvida é: A minha chave composta, os dois IDs são ids de outras entidades. Eu posso mapear estes atributos como o tipo da entidade ou somente por um tipo numérico (Long, Integer....)?

Segunda dúvida: Como fazer uma busca, com JPA, retornando uma lista de objeto (uma entidade) onde uma campo da minha chave composta é o parâmetro? Ex: CLasse AulaPK (chave composta)
import javax.persistence.Embeddable;

@Embeddable
public class AulaPk {
    
    private Aula aula;
    
    private Professor professor;

    public Aula getAula()
    {
        return aula;
    }

    public void setAula(Aula aula) 
    {
        this.aula = aula;
    }

    public Professor getProfessor()
    {
        return professor;
    }

    public void setProfessor(Professor professor)
    {
        this.professor = professor;
    }
}
Classe Aula
import java.util.Calendar;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
public class Aula 
{
    @EmbeddedId
    private AulaPk pk;
    
    @Temporal(TemporalType.DATE)
    private Calendar hora;

    public Calendar getHora() {
        return hora;
    }

    public void setHora(Calendar hora) {
        this.hora = hora;
    }

    public AulaPk getPk() {
        return pk;
    }

    public void setPk(AulaPk pk) {
        this.pk = pk;
    }
    
}

*Notem que as duas classes foram geradas como exemplo.

Como buscar todas as aulas de um professor?

2 Respostas

W

Sempre que você escreve uma pk composta, ela deve implementar Serializable e implementar os métodos equals e hashCode adequadamente.

Em relação a mapeamentos com outras entidades, não é que seja impossível, mas não é recomendável. Até por que fica muito mais complicado gerar os equals e hashCode. O ideal é mapear só os tipos mesmo, assim:

@Embeddable
public class AulaPk implements Serializable {
   private Integer codigoAula;
   private Integer codigoProfessor;

   //equals e hashCode
}

Pra você acessar um Professor a partir da Aula, você pode fazer o mapeamento direto na classe Aula:

@Entity
public class Aula {
   @EmbeddedId
   private AulaPk pk;
   @ManyToOne
   @Column(insertable=false, updatable=false)
   private Professor professor;
}

Precisa ser insertable e updatable false. Este campo serve apenas pra carregar o professor, ele não é inserido/atualizado (perceba que ele é redundante!)

Uma dica: se puder, evite chaves compostas no Hibernate. Faça um código simples e use unique pra restringir os campos… fica bem mais simples. Mas se o banco já tá feito, não tem o que fazer… hehe

Pra buscar as aulas do professor:

Criteria criteria = session.createCriteria(Aula.class);
criteria.add(Restrictions.eq("professor", professor));
return criteria.list();

Abraço.

G

wagnerfrancisco, muito obrigado pela resposta.
Em relação a chave composta, pode ter certeza que é por causa de um aplicativo que já está no banco…
Mas você tirou as minhas dúvidas.
Valeu. Abraço.

Criado 11 de julho de 2012
Ultima resposta 12 de jul. de 2012
Respostas 2
Participantes 2