Entity
Uma Entity (Entidade) é um objeto leve de domínio persistente utilizado para representar uma tabela da base de dados, sendo que cada instância da entidade corresponde a uma linha da tabela.
A Entity é baseada em uma simples classe Java do tipo Plain Old Java Object (POJO), portanto uma classe Java comum com anotações para fornecer informações mais especifica ao gerenciador das entidades.
Exemplo de entity que representa um produto:
package pbc.jpa.exemplo1.entity;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
/**
* Classe utilizada para representar a tabela Produto.
*/
@Entity
public class Produto implements Serializable {
private static final long serialVersionUID
= 4185059514364687794L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String descricao;
@Temporal(TemporalType.DATE)
private Date dataValidade;
private Double peso;
public Date getDataValidade() { return dataValidade; }
public void setDataValidade(Date dataValidade) {
this.dataValidade = dataValidade;
}
public String getDescricao() { return descricao; }
public void setDescricao(String descricao) {
this.descricao = descricao;
}
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public Double getPeso() { return peso; }
public void setPeso(Double peso) { this.peso = peso; }
}
Neste exemplo é utilizada a anotação @Entity para definir está classe como uma entidade do banco de dados. Utilizamos a anotação @Id define que o atributo Long id é chave primaria da tabela Produto; também é definido que o atributo Long id tem seu valor gerado automaticamente através da anotação @GeneratedValue. Quando têm atributos que representam datas ou tempos é necessário adicionar a anotação @Temporal para definir que o atributo Date dataValidade é um campo Date no banco de dados.
O relacionamento feito entre a classe Java e a tabela do Banco de Dados, ocorre automaticamente quando o nome da classe é igual ao nome da tabela; o mesmo vale para os atributos que correspondem às colunas da tabela. Desta forma quando solicitar ao JPA para salvar, consultar, alterar ou excluir uma entidade automaticamente será criado o Script SQL para executar a operação.
Esta classe está implementando a interface java.io.Serializable para informar que pode ser serializada e trafegada pela rede de computadores. Quando as entidades fazem parte de uma aplicação console ou desktop não há necessidade de implementar esta interface, a não ser que a aplicação precise trafegar o objeto desta classe pela rede ou em algum HD. Quando implementada esta interface também é preciso definir o atributo private static final long serialVersionUID com um número longo, isto serve para identificar a classe quando o objeto for trafegar via rede.
Observação: o nome das tabelas no banco de dados não é case sensitive quando o banco de dados é instalado no Windows, no caso do Linux já é case sensitive.
Anotações para Entity
As entidades podem ser melhor detalhadas adicionando mais algumas anotações e suas propriedades, estas anotações podem informar ao JPA que por exemplo, uma entidade não segue o padrão de nome igual ao da tabela, ou que sua tabela no banco tem um relacionamento de Um-Para-Muitos com outra tabela, que a tabela utiliza um gerador de ID do tipo SEQUENCE para definir o número da chave primaria e outras informações que veremos a seguir:
Obrigatoriamente toda entidade do JPA precisa ter pelo menos as anotações javax.persistence.Entity que informa que é uma tabela do banco de dados e javax.persistence.Id que informa qual o atributo é chave primaria da tabela.
javax.persistence.Entity
Usado para definir que a classe é uma Entity, por padrão quando o nome da Entity é igual ao nome da tabela o relacionamento é feito automaticamente pelo JPA. As propriedades da anotação @Entity são listadas na tabela a seguir:
Propriedade | Descrição |
---|---|
name | Informa o nome da entidade, por padrão o nome da entidade é nome da classe. Este nome é utilizado para referenciar a entidade na consulta. |
javax.persistence.Table
Define o nome da tabela no banco de dados. As propriedades da anotação @Table são listadas na tabela a seguir:
Propriedade | Descrição |
---|---|
catalog | O catalogo da tabela. |
name | O nome da tabela. |
schema | O esquema da tabela. |
uniqueConstraints | Regras que podem ser adicionadas na tabela. |
javax.persistence.Id
Informa o atributo da Entity que representa a chave primaria.
javax.persistence.Column
Informa as configurações de coluna da tabela, por padrão quando o nome do atributo da Entity é igual ao nome da coluna da tabela, o relacionamento é feito automaticamente pelo JPA. As propriedades da anotação @Column são listadas na tabela a seguir:
Propriedade | Descrição |
---|---|
columnDefinition | Definição do tipo da coluna. |
insertable | Informa se a tabela deve ser incluída no SQL de insert, por padrão é true. |
length | Tamanho da coluna, por padrão é 255. |
name | Nome da tabela que contém está coluna, se não for informado a coluna assume o nome da tabela da entity. |
nullable | Informa se o valor pode ser null. |
precision | Precisão da coluna decimal. |
scale | Número de casas decimais, usado somente em coluna com número decimal. |
table | Nome da tabela que contém está coluna, se não for informado assume o nome da tabela da entity. |
unique | Informa se a coluna é chave única. |
updatable | Informa se a coluna deve ser incluída no SQL de update, por padrão é true. |
javax.persistence.SequenceGenerator
Utilizado para representar uma sequência numérica gerada através do banco de dados. As propriedades da anotação @SequenceGenerator são listadas na tabela a seguir:
Propriedade | Descrição |
---|---|
name | Nome único para o gerador que pode ser referenciado por uma ou mais classes que pode ser utilizado para gerar valores de chave primaria. |
allocationSize | A quantidade que será incrementada na sequence, o padrão é 50. |
initialValue | Valor inicial da sequence. |
sequenceName | Nome da sequence do banco de dados. |
javax.persistence.GeneratedValue
Define a estratégia para criar o ID, pode ser tipo AUTO (incrementa automaticamente 1, 2, 3 em sequência) ou utilizando uma SEQUENCE. As propriedades da anotação @GeneratedValue são listadas na tabela a seguir:
Propriedade | Descrição |
---|---|
generator | Nome do gerador da chave primaria que é especificado na anotação @SequenceGenerator ou @TableGenerator. |
strategy | Estratégia de geração de chave primaria que o serviço de persistência precisa usar para gerar a chave primaria. Seu valor pode ser obtido através da enum javax.persistence.GenerationType, os valores podem ser AUTO, IDENTITY, SEQUENCE ou TABLE. |
javax.persistence.Temporal
Utilizado para representar campos de Data e Hora, nesta anotação podemos definir o tipo de dado DATE, TIME e TIMESTAMP. As propriedades da anotação @Temporal são listadas na tabela a seguir:
Propriedade | Descrição |
---|---|
value | O tipo usado para mapear java.util.Date e java.util.Calendar. Seu valor pode ser obtido através da enum javax.persistence.TemporalType, os valores podem ser DATE, TIME e TIMESTAMP. |
javax.persistence.Transient
Informa que o atributo não é persistente.
Exemplo de Entity
Nesse exemplo será criado uma entity para tabela Usuario a seguir:
CREATE TABLE Usuario (
id NUMBER(10) NOT NULL PRIMARY KEY,
nome VARCHAR2(100) NOT NULL,
dataNasc DATE NOT NULL,
email VARCHAR2(150) NOT NULL,
ativo NUMBER(1) NOT NULL,
comentario VARCHAR2(200)
);
Crie a Entity para representar a tabela Usuario:
package pbc.jpa.exemplo1.entity;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
/**
* Entidade utilizada para representar um Usuario.
*/
@Entity
public class Usuario implements Serializable {
private static final long serialVersionUID
= -8762515448728066246L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(nullable = false)
private String nome;
@Temporal(TemporalType.DATE)
@Column(name="dataNasc", nullable = false)
private Date dataNascimento;
@Column(nullable = false)
private String email;
@Column(nullable = false)
private Boolean ativo;
private String comentario;
public Boolean getAtivo() { return ativo; }
public void setAtivo(Boolean ativo) {
this.ativo = ativo;
}
public String getComentario() { return comentario; }
public void setComentario(String comentario) {
this.comentario = comentario;
}
public Date getDataNascimento() {
return dataNascimento;
}
public void setDataNascimento(Date dataNascimento) {
this.dataNascimento = dataNascimento;
}
public String getEmail() { return email; }
public void setEmail(String email) {
this.email = email;
}
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getNome() { return nome; }
public void setNome(String nome) { this.nome = nome; }
}
Foi utilizada a anotação @Entity para informar que a classe Usuario é uma entidade do banco de dados; também foi definido que a propriedade Long id será o ID da tabela através da anotação @Id e é informado que seu valor será gerado automaticamente com a anotação @GeneratedValue. Por meio da anotação @Column é especificado quais os atributos não podem ser null e que o atributo Date dataNascimento está mapeado para a coluna dataNasc da tabela Usuario.