Mesmo com a criação do JPA, muitos profissionais ainda optam por utilizar o mapeamento via XML. Bom, isso é apenas questão de gosto de facilidade de uso, ou seja, se você possui mais facilidade com XML do que anotações, obviamente que optará por XML.
Porém, vale ressaltar que mapeamento as classes do hibernate com XML você está indo “contra” o avanço tecnológico, e corre um grande risco de sofrer da descontinuação de tecnologia. Então aconselhamos fortemente que você desde já adapte-se ao padrão JPA.
A vantagem de utilizar o JPA é evidente: desacoplamento de tecnologia, ou seja, a qualquer momento você pode escolher se deseja continuar com o Hibernate ou mudar para outro container como Top Link, por exemplo, sem precisar mudar seus mapeamentos.
Enfim, nosso objetivo neste artigo é demonstrar o mapeamento de classes em XML.
Mapeamento Classe Básica
Vamos criar uma classe simples em Java chamada “Venda”, mais especificamente um Bean.
Listagem 1: Classe Venda
public class Venda{
private int id;
private Date data;
private Cliente cliente;
private Atendente atendente;
private String observacao;
private String situacao;
private Set<ItemVenda> itens;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Date getData() {
return data;
}
public void setData(Date data) {
this.data = data;
}
public Cliente getCliente() {
return cliente;
}
public void setCliente(Cliente cliente) {
this.cliente = cliente;
}
public Atendente getAtendente() {
return atendente;
}
public void setAtendente(Atendente atendente) {
this.atendente = atendente;
}
public String getObservacao() {
return observacao;
}
public void setObservacao(String observacao) {
this.observacao = observacao;
}
public String getSituacao() {
return situacao;
}
public void setSituacao(String situacao) {
this.situacao = situacao;
}
public Set<ItemVenda> getItens() {
return itens;
}
public void setItens(Set<ItemVenda> itens) {
this.itens = itens;
}
}
Nossa Classe Venda irá utilizar muitos mapeamentos para efeito de aprendizagem. Vamos criar a classe Cliente e Atendente respectivamente.
Listagem 2: Classe Cliente e Atendente
public class Cliente{
private int id;
private String nome;
private String cpf;
private String endereco;
private Date dataNascimento;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getCpf() {
return cpf;
}
public void setCpf(String cpf) {
this.cpf = cpf;
}
public String getEndereco() {
return endereco;
}
public void setEndereco(String endereco) {
this.endereco = endereco;
}
public Date getDataNascimento() {
return dataNascimento;
}
public void setDataNascimento(Date dataNascimento) {
this.dataNascimento = dataNascimento;
}
}
public class Atendente{
private int id;
private String matricula;
private String cargo;
private String nome;
private String cpf;
private String endereco;
private Date dataNascimento;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getMatricula() {
return matricula;
}
public void setMatricula(String matricula) {
this.matricula = matricula;
}
public String getCargo() {
return cargo;
}
public void setCargo(String cargo) {
this.cargo = cargo;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getCpf() {
return cpf;
}
public void setCpf(String cpf) {
this.cpf = cpf;
}
public String getEndereco() {
return endereco;
}
public void setEndereco(String endereco) {
this.endereco = endereco;
}
public Date getDataNascimento() {
return dataNascimento;
}
public void setDataNascimento(Date dataNascimento) {
this.dataNascimento = dataNascimento;
}
}
Por fim, na listagem 3 criaremos a classe ItemVenda.
Listagem 3: Classe ItemVenda
public class ItemVenda{
private int id;
private String descricao;
private int quantidade;
private double valor;
private Venda venda;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
public int getQuantidade() {
return quantidade;
}
public void setQuantidade(int quantidade) {
this.quantidade = quantidade;
}
public double getValor() {
return valor;
}
public void setValor(double valor) {
this.valor = valor;
}
public Venda getVenda() {
return venda;
}
public void setVenda(Venda venda) {
this.venda = venda;
}
}
Perceba que nossa classe ItemVenda faz referência para a Venda. Depois de criar todas as classes necessárias vamos iniciar o mapeamento XML, para não prolongar muito o artigo e torná-lo cansativo, vamos mapear a classe mais “importante” que possui todos os relacionamentos que precisamos aprender: a classe Venda.
Listagem 4: Mapeamento XML da Classe Venda
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping auto-import="true">
<class name="br.com.meuprojeto.bean.Venda" schema="venda"
table="venda" dynamic-update="true">
<id name="id" type="integer">
<generator class="sequence">
<param name="sequence">venda.venda_id_seq</param>
</generator>
</id>
<property name="data" type="date" column="data" />
<property name="observacao" type="string" column="observacao" />
<many-to-one name="cliente" class="br.com.meuprojeto.bean.Cliente"
column="id_cliente" cascade="none" outer-join="false" />
<many-to-one name="atendente" class="br.com.meuprojeto.bean.Atendente"
column="id_atendente" cascade="none" outer-join="false" />
<many-to-one name="situacao" class="br.com.meuprojeto.bean.Situacao"
column="id_situacao" cascade="none" outer-join="false" />
<set name="itens" table="venda.item_venda" cascade="all"
outer-join="true" fetch="subselect" >
<key column="id_venda" />
<one-to-many class="br.com.meuprojeto.bean.ItemVenda" />
</set >
</class>
</hibernate-mapping>
CONCLUSÃO
Este artigo foi apenas para demonstrar o uso completo de um mapeamento XML no Hibernate, com relacionamentos “Master-Detail”, fique a vontade para usar o mesmo conceito para JPA.
Espero que tenham gostado, caso tenham alguma dúvida podem ficar a vontade em usar os comentários que terei prazer em responder.