Mapeando chaves compostas com JPA 2

Muitas vezes utilizamos em nossas tabelas chaves compostas para identificação de uma tupla, um exemplo seria na tabela empregado a chave primária ser composta pelos atributos cpf e matrícula do empregado, vocês podem dizer que bastaria o cpf ou a matrícula para identificar o empregado, mas aqui estou apenas exemplificando para mostrar como mapeamos esta chave composta utilizando JPA2.

Para isso a JPA nos oferece 2 estratégias de mapeamento:

  • IdClass
  • EmbeddedId

Eu até o momento ainda não identifiquei uma diferença de desempenho entre as duas estratégias, nem vejo vantagem em questão de verbosidade de uma em relação a outra, portanto mostrarei as 2 e quem quiser escolhe a que melhor convir.

Utilizando IdClass 

Para se utilizar de idClass precisamos criar uma classe com os atributos que compõem nossa chave primária da seguinte maneira:

public class EmpregadoId {

private String cpf;
private String matricula;

//getters e setters
@Override
public int hashCode() {
//código hashcode
}

@Override
public boolean equals(Object obj) {
//código equals
}
}

Devemos sempre implementar os métodos hashcode e equals da nossa classe de Id, o hibernate apenas dará um alerta caso não estejam implementados estes métodos.

Agora na nossa classe de entidade devemos ter o seguinte código:

@Entity
@IdClass(EmpregadoId.class)
public class Empregado {

@Id
private String cpf;

@Id
private String matricula;

//Outros atributos e getters e setters

Ou seja, basta anotar com @IdClass a classe de entidade, passando por parâmetro a classe que contém os atributos do id, e devemos anotar com @Id os atributos que compõem o id, que são os mesmos da classe de id.

E é só, nessa estratégia a classe que representa o id não precisa de anotações, e não será utilizada pela nossa aplicação, porém é necessária para que a estratégia funcione.

 

Utilizando EmbeddedId

Nesta  estratégia também precisamos de uma classe com os atributos da chave primária, porém esta classe deve ser anotada como @Embeddable e deve obrigatoriamente implementar a interface Serializable , além de implementar os métodos hashcode e equals assim como na estratégia anterior. Assim temos a classe de id da seguinte maneira:

@Embeddable
public class EmpregadoId implements Serializable {

private static final long serialVersionUID = 1L;
private String cpf;
private String matricula;

//getters e setters
@Override
public int hashCode() {
//código hashcode
}

@Override
public boolean equals(Object obj) {
//código equals
}
}

Já a nossa entidade ficará da seguinte maneira:

@Entity
public class Empregado {

@EmbeddedId
private EmpregadoId id;

//Outros atributos e getters e setters

Ou seja, agora para acessar os atributos da chave primária composta devemos buscar através do atributo id que será do tipo EmpregadoId, que é anotado com @EmbeddedId  .

_____________________________________________________________________________________

Vimos então como é simples mapear chaves primárias compostas utilizando JPA 2, o único problema é que sempre precisamos de uma classe auxiliar que possuirá os atributos que compõem a chave.

Deixe uma resposta

O seu endereço de email não será publicado Campos obrigatórios são marcados *