Quando se trabalha com chave primária composta, o Hibernate precisa
de mais uma classe auxiliar para definir essa chave primária
Assim sendo, crie uma interface chamada PrimaryKey
public class PrimaryKey {
public Object getKey();
public void setKey(Object obj);
}
Vamos fazer um pequeno exemplo: uma classe Pessoa que tem os seguintes atributos: cpf, rg, sexo , nome e data de nascimento. Suas chaves primárias são cpf e rg(só exemplo!!!)
código da chave primária:
public class PessoaPrimaryKey implements PrimaryKey, Serializable {
private String cpf; //metodos get e set omitidos
private String rg; //metodos get e set omitidos
public Object getKey() {
return this;
}
public void setKey(Object obj) {
if (obj instanceof PessoaPrimaryKey) {
PessoaPrimaryKey pk = (PessoaPrimaryKey) obj;
this.setCpf(pk.getCpf());
this.setRg(pk.getRg());
}
}
/*Não esquece de implementar equals e hasCode*/
}
Código da classe Pessoa:
public class Pessoa implements Serializable {
private String cpf;
private String rg;
private String sexo;
private String nome;
private java.util.Date dataNasc;
private PessoaPrimaryKey pessoaPK;
//metodos get set omitidos
/*Não esquece de implementar equals e hasCode*/
}
Feito isso, lá no mapeamento do hibernate, essa classe exemplo fica assim:
<class name="exemplo.Pessoa" table="tabela_pessoa" >
<composite-id name = "pessoaPK" class="exemplo.PessoaPrimaryKey" >
<key-property name="cpf" type="java.lang.String" column="cpf" />
<key-property name="rg" type="java.lang.String" column="rg" />
</composite-id>
<property name="sexo" type="java.lang.String" column="sexo" />
<property name="nome" type="java.lang.String" column="nome" />
<property name="dataNasc" type="java.util.Date" column="dataNasc" />
</class>
Espero que esse exemplo te ajude na compreensão. Só um comentário: eu vi na documentação do Hibernate que o uso de composite-id é fortemente desaconselhável, mas cá pra nós, essa abordagem tá resolvendo um grande problema que eu tive de importação de grandes massas de dados usando persistência.
“Pela graça sois salvos por meio da fé, e isso não vem de vós, é dom de Deus”