Mapeando Atributos de Classes com Anotações Hibernate
por:
Raphaela Galhardo (raphaela@jeebrasil.com.br)
Gleydson Lima (gleydson@jeebrasil.com.br)
Este tutorial destina-se a
apresentar alguns exemplos de mapeamentos de atributos de uma classe, usando
anotações Hibernate. Os atributos mapeados e apresentados não correspondem a
associações/relacionamentos entre tabelas, ou seja, associações
many-to-many, one-to-many, one-to-one ou
many-to-one.
1. Mapeando Atributos da Classe
Considerando a classe Cliente,
exibida na Figura 1, composta de um conjunto de atributos, onde um
deles (id) corresponde à chave primária da tabela
correspondente. Dessa forma, pode-se criar uma tabela cliente
na base de dados a partir do script mostrado na e Listagem 1.\
Figura 1 - Classe Cliente
CREATE TABLE anotacoes.cliente
(
id_cliente integer NOT NULL,
cpf bigint NOT NULL,
nome character(40) NOT NULL,
endereco character(100),
total_compras numeric(16,2),
data_cadastro timestamp without time zone NOT NULL,
data_nascimento date
)
WITHOUT OIDS;
ALTER TABLE anotacoes.cliente OWNER TO postgres;
Listagem 1 – Script para a
Criação da Tabela cliente
A classe Cliente, ilustrada pela Listagem
2, possui exemplos de mapeamentos de atributos a partir das
anotações: @Column, @Transient, @Temporal. As
anotações @Id e @GeneratedValue também são utilizadas
e servem para mapear a chave primária da tabela correspondente e
definir como o seu valor será gerado, respectivamente, como
explicado no tutorial anterior.
package br.com.jeebrasil.hibernate.anotacoes.dominio;
import javax.persistence.*;
@Entity
@Table(name="cliente", schema="anotacoes")
public class Cliente {
@Transient
private int temporaria;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name="id_cliente")
private int id;
@Column(unique=true, nullable=false,
insertable=true, updatable=true)
private long cpf;
@Column(nullable=false, length=40,
insertable=true, updatable=true)
private String nome;
@Column(length=100)
private String endereco;
@Column(name="total_compras", precision=2)
private double totalCompras;
@Column(name="data_nascimento", nullable=false)
@Temporal(TemporalType.DATE)
private Date dataNascimento;
@Column(name="data_cadastro")
@Temporal(TemporalType.TIMESTAMP)
private Date dataCadastro;
public Cliente(){}
//Métodos getters e setters
}
Listagem 2 – Mapeamento da
Classe Cliente com Anotações
A seguir uma breve descrição das anotações
utilizadas:
- Anotação @Transient: informa que o atributo mapeado
não possui correspondente na tabela mapeada pela classe, ou
seja, não é um atributo persistente;
- Atributos da anotação @Column utilizados:
- name: nome da coluna na tabela do banco de dados
que representa o atributo;
- unique: indica se a coluna na tabela que
representa o atributo possui a restrição de unicidade ou
não. Por padrão, assume o valor false;
- nullable: indica se a coluna na tabela que
representa o atributo pode assumir valor nulo ou não. Por
padrão, assume o valor true, indicando que pode assumir
valores nulos;
- length: informa o tamanho máximo assumido pelo
valor da coluna na tabela;
- precision: informa a precisão decimal dos
possíveis valores para a coluna mapeada pelo atributo;
- insertable: indica se o atributo será inserido no
momento da inserção de uma linha na tabela. Por padrão
assume o valor true;
- updatable: indica se o atributo será atualizado
no momento da atualização de uma linha na tabela. Por padrão
assume o valor true.
- Anotação @Temporal: utilizada para mapeamento de
datas e hora. Recebe um valor como argumento que pode ser:
- TemporalType.DATE: usado para mapear datas;
- TemporalType.TIME: usado para mapear datas e
hora;
- TemporalType.TIMESTAMP: usado para mapear
hora.
2. Definição de Chave Primária Utilizando uma Seqüência
Própria
Nos mapeamentos apresentado na seção
anterior, a definição dos valores das chaves primárias foi feita
apenas utilizando a seqüência hibernate_sequence. O
exemplo presente na Listagem 3 mostra o mapeamento da chave
primária da tabela cliente utilizando a seqüência de nome
cliente_seq. Para isso, utilizou-se as anotações
@SequenceGenerator e @GeneratedValue.
Na anotação @SequenceGenerator
define-se qual seqüência criada na base de dados será utilizada
para o mapeamento. No caso, nomeia-se a seqüência com o nome
SEQ_CLIENTE (name = “SEQ_CLIENTE”).
Para definir qual seqüência será
utilizada no mapeamento da chave primária, utiliza-se a anotação
@GeneratedValue, onde é informado que a definição do
valor do atributo será através de seqüências (strategy =
GenerationType.SEQUENCE) e o nome da mesma (generator =
"SEQ_CLIENTE").
package br.com.jeebrasil.hibernate.anotacoes.dominio;
import javax.persistence.*;
@Entity
@Table(name="cliente", schema="anotacoes")
public class Cliente {
@Id
@SequenceGenerator(name = "SEQ_CLIENTE",
sequenceName = " anotacoes.cliente_seq")
@GeneratedValue( strategy = GenerationType.SEQUENCE,
generator = "SEQ_CLIENTE")
@Column(name="id_cliente")
private int id;
//...
}
Listagem 3 – Mapeamento
de Chave Primária Usando Seqüência Própria
3. Conclusões
Este tutorial foi breve, porém teve o
intuito de apresentar o mapeamento de atributos da classe que
não pertencem a relacionamentos. Também foi apresentado como se
mapear uma chave primária para que a mesma tenha seu valor
definido através de uma seqüência criada na base de dados.
Nos próximos tutoriais serão
apresentados os mapeamentos de relacionamentos many-to-many,
one-to-many, one-to-one ou many-to-one,
de forma, que é importante ter em mente também o mapeamento dos
tipos de atributos apresentados.