Inicialmente analisaremos o que é uma Entidade (Entity), um conceito importante para entender JPA. Entidade não é algo novo na área de gerenciamento de dados. Entidades são mais antigos do que muitas linguagens de programação, inclusive Java. As entidades foram inicialmente introduzidas por Peter Chen no seu artigo "entity-relationship modeling". Peter Chen definiu uma entidade como “coisas que possuem atributos e relacionamentos”. Os atributos e relacionamentos seriam persistidos numa base de dados relacional.

No paradigma orientado a objetos devemos adicionar comportamentos à essas entidades. Na JPA qualquer objeto pode ser uma entidade, desde que tenha as características abaixo:

Persistível: Essa é a primeira característica de uma entidade, elas são persistíveis, ou seja, o seu estado pode ser representado numa base de dados e pode ser acessada a qualquer momento. Tecnicamente falando um objeto só deveria ser considerado persistente no momento em que ele é instanciado na memória. Portanto, se um objeto persistente existe, por definição ele já é persistente.

Os objetos não são automaticamente persistentes, um método da API JPA deve ser invocado para iniciar o processo de persistência. Isso é importante porque deixa o controle de persistência nas mãos da aplicação. Assim, a aplicação tem a flexibilidade para manipular informações e efetuar lógica de negócio na entidade, tornando-a persistente apenas quando a aplicação decidir que já é hora de efetuar a persistência. Portanto, uma entidade pode ser manipulada sem necessariamente ser persistida e cabe à aplicação decidir se ela deve ser persistida ou não.

Identidade: Assim como qualquer objeto Java, uma entidade tem um objeto identidade, mas quando isto existe na base de dados, este objeto também tem uma Identidade Persistente. Identidade persistente, ou um identificador, é uma chave que é única e identifica uma instancia de uma entidade e distingue ela de todas as outras instâncias de um mesmo tipo de entidade. Uma entidade tem uma identidade persistente quando existe uma representação dela numa base de dados, ou seja, uma linha (row) numa tabela da base de dados. Se uma entidade não existe numa base de dados, mas está na memória com um campo de identidade setado, isso não significa que ela tenha uma identidade persistente. Portanto, a identidade persistente ou identificador é equivalente a uma chave primária numa tabela da base de dados que armazena o estado da entidade.

Transacional: Entidades são "quase transacionais". Embora elas possam ser criadas, atualizadas e deletadas em qualquer contexto, essas operações são normalmente feitas dentro de um contexto transacional, porque uma transação é necessária para que as alterações sejam comitadas (committed) na base de dados.

Na memória, as coisas são um pouco diferentes, visto que as entidades podem ser alteradas sem que as mudanças nunca sejam persistentes. Mesmo quando numa transação, elas podem ser deixadas num estado inconsistente ou indefinido num evento de um rollback ou uma falha de transação. As entidades na memória são simples objetos Java que obedecem todas as regras e constantes que são aplicadas pela JVM a outros objetos Java.

Granularidade: Entidades são objetos de granularidade fina que tem um conjunto de estados agregados que é normalmente armazenado num lugar único, como uma linha numa tabela, e tipicamente possui relacionamento com outras entidades. Entidades são basicamente objetos de um domínio de negócio que tem significados específicos para uma aplicação que os acessa.

Metadados para Entidades

Além do estado persistente, toda entidade tem algum metadado associado que o descreve. Este metadado pode existir como parte de uma classe ou pode ser armazenado externamente à classe, porém este metadado não é persistido na base de dados. Isto permite que a camada de persistência reconheça, interprete e gerencie a entidade a partir do momento que ela é carregada por meio de uma invocação.

O metadado requerido por cada entidade é mínimo, tornando as entidades fáceis de definir e usar. No entanto, como qualquer outra tecnologia sofisticada, é possível especificar muito mais metadados do que é realmente necessário. Isto depende da aplicação e pode ser utilizado para customizar todo detalhe de configuração de uma entidade. Um metadado para uma entidade pode ser especificado através de anotações (diretamente na classe da entidade) ou através de um arquivo XML. Ambos são válidos, mas a escolha do desenvolvedor ou da equipe dependerá das preferencias do desenvolvimento ou do processo.

Metadados em Anotações é uma característica da linguagem introduzida na versão Java SE 5. Embora as anotações não sejam obrigatórias pela JPA, elas são um caminho conveniente para aprender e usar a API. Caso as anotações sejam colocadas nas classes, não é necessário utilizar XML apenas para especificar metadados. No entanto, para os que preferem o tradicional arquivo XML, este também está disponível e se o desenvolvedor já sabe ou já trabalhou com anotações ficará ainda mais fácil operar os arquivos XML que foram modelados após as anotações na JPA.

Criando uma Entidade

Classes Java são facilmente transformadas em entidades simplesmente anotando-as. De fato, adicionando um pouco de anotações qualquer classe com um construtor sem argumentos pode transformar-se em uma entidade e assim pode possuir todas as características que uma entidade pode possuir, conforme já foi citado anteriormente.

Vamos ver um exemplo inicial de uma classe simples que modela os artigos de um sistema.

Listagem 1: Exemplo de uma classe que modela os artigos de um sistema


public class Artigo {

	public Artigo() {
	}
	
	
	int id;
	String assunto;
	String titulo;
	String texto;


	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getAssunto() {
		return assunto;
	}
	
	public void setAssunto(String assunto) {
		this.assunto = assunto;
	}
	
	public String getTitulo() {
		return titulo;
	}
	
	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}
	
	public String getTexto() {
		return texto;
	}

	public void setTexto(String texto) {
		this.texto = texto;
	}
	
}

Esta classe nada mais é do que uma classe estilo javaBean com quatro propriedades representados por seus pares de métodos de acesso (gets e sets). Propriedades ou membros são as unidades de estado dentro da nossa entidade que nós queremos persistir.

Para tornar nossa classe Java persistente, temos que anotá-la com @Entity. Isto é apenas uma anotação para indicar à engine de persistência que a classe é uma entidade.

A segunda anotação que precisamos é adicionar a anotação @Id, que indica que este campo ou propriedades é uma chave primária ou que é a unidade persistente de uma entidade. Ela é necessária para o provedor saber qual campo ou propriedade usar como uma chave de identificação única na tabela.

Agora com apenas essas simples configurações nós temos uma entidade. Abaixo o código de como ficou a nossa entidade.

Listagem 2: Exemplo da classe Java anterior sendo uma entidade


@Entity
public class Artigo {

	public Artigo() {}
public Artigo(int id) {this.id = id;}
	
	@Id
	int id;
	String assunto;
	String titulo;
	String texto;


	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getAssunto() {
		return assunto;
	}
	
	public void setAssunto(String assunto) {
		this.assunto = assunto;
	}
	
	public String getTitulo() {
		return titulo;
	}
	
	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}
	
	public String getTexto() {
		return texto;
	}

	public void setTexto(String texto) {
		this.texto = texto;
	}
			
}

A anotação @Id pode ser colocada tanto na propriedade, conforme é mostrado no exemplo acima, quanto acima do método getId(). Preferiu-se colocar acima do campo por ser mais simples e mais direto. Portanto, este campo será automaticamente persistente.

Quando não especificamos a anotação @Column acima dos campos ou das propriedades, tem-se que os valores defaults serão mapeados para o banco de dados. Por exemplo, como usamos id, assunto, titulo e texto, tem-se que esses são também os nomes das colunas do Banco de Dados, além disso, o nome da tabela do banco de dados é Artigo, conforme definido pelo nome da classe. Se esses não forem os reais valores, usa-se a propriedade name na anotação Entity como: @Entity(name="nomeDaTabelaNoBanco") e também @Column(name="nomeDaColunaNoBanco"). Segue abaixo um exemplo de mapeamento quando temos diferentes nomes de colunas para diferentes nomes das propriedades.

Listagem 3: Exemplo da classe anotação com campos diferentes das colunas


@Entity(name=”ArtigoTable”)
public class Artigo {

	public Artigo() {}
public Artigo(int id) {this.id = id;}
	
	@Id
@Column(name="NRO_INT_ARTIGO")
	int id;
	@Column(name="ASSUNTO_ARTIGO ")
	String assunto;
@Column(name="TITULO_ARTIGO ")
	String titulo;
	@Column(name="TEXTO_ARTIGO")
	String texto;


	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getAssunto() {
		return assunto;
	}
	
	public void setAssunto(String assunto) {
		this.assunto = assunto;
	}
	
	public String getTitulo() {
		return titulo;
	}
	
	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}
	
	public String getTexto() {
		return texto;
	}

	public void setTexto(String texto) {
		this.texto = texto;
	}
			
}

Conclusão

Neste artigo vimos uma introdução sobre as entidades em JPA. Vimos que as entidades possuem atributos e relacionamentos e que possuem características como persistência, identidade, transacionalidade e granularidade. Também vimos que podemos criar entidade de diferentes formas e também vimos como podemos criar uma entidade com a utilização de anotações. Além disso, mostramos exemplos práticos sobre a criação de entidades.

Bibliografia

Leia também