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.

 

Free Web Hosting