3 - Persistência de Dados usando JPA - Java Persistence API
From Grupo2 Ahand
Contents |
[edit] Introdução
JPA (Java Persistence API) é a especificação padrão para o gerenciamento de persistência e mapeamento objeto relacional, surgida na plataforma Java EE 5.0 (Java Enterprise Edition) na especificação do EJB 3.0 (Enterprise Java Beans 3.0). Introduzida no intuito de substituir os Entity Beans (que foram descontinuados) e simplificar o desenvolvimento de aplicações Java EE e Java SE que utilizam persistência de dados, possui uma completa especificação para realizar mapeamento objeto relacional, utilizando anotações da linguagem Java (Java SE 5.0 ou superior). Também dá suporte a uma rica linguagem de consulta, semelhante à SQL, permitindo consultas estáticas ou dinâmicas.
Um dos principais conceitos relacionados à API JPA é o de entidade. Uma entidade corresponde a um objeto que pode ser gravado na base de dados a partir de um mecanismo de persistência. A classe que implementa a entidade persistente é um POJO, que basicamente contém um construtor padrão sem argumentos e uma chave primária e também não precisa derivar de nenhuma interface ou classe, nem implementar qualquer método em especial.
Quando se decide utilizar o JPA, é necessária a escolha de um provedor JPA. Como esta API é uma especificação para frameworks de persistência, existe a necessidade de provedores JPA. Por padrão, a implementação de referência é o Oracle Toplink Essentials. Também existem outros provedores JPA no mercado, como o Hibernate Entity Manager, Bea Kodo e o ApacheJPA.
É importante ressaltar que como a JPA é um padrão do Java Community Process, ela permite que diversos fabricantes trabalhem sobre os mesmos conceitos e que o desenvolvedor escolha a implementação de sua preferência. A padronização traz também outra importante vantagem : pode-se alternar entre as implementações de fabricantes distintos que estejam em conformidade com o padrão JPA sem nenhum esforço adicional. Dessa forma , uma aplicação codificada com JPA irá funcionar com qualquer implementação JPA de fabricantes distintos não havendo necessidade de se conhecer, de maneira geral, qual tecnologia será utilizada.
[edit] Gerenciador de Entidades
Nas diversas aplicações existentes, sempre que for necessário propagar o estado de um objeto que está em memória para o banco de dados ou vice-versa, há a necessidade de que a aplicação interaja com uma camada de persistência. Com a API JPA, isso é feito invocando o gerenciador de persistência, também conhecido como gerenciador de entidades (EntityManager), responsável por quase todas as operações de persistência de objetos : criação , atualização, exclusão, localização,consultas, etc ). O entity manager do JPA é uma instância da interface javax.persistence.EntityManager.
Um outro conceito também relacionado a esta especificação é o de contexto persistente (PersistenceContext), que é uma área de memória onde os objetos persistentes se encontram. Quando se interage com o mecanismo de persistência, é necessário para a aplicação ter conhecimento sobre os estados do ciclo de vida da persistência. Em aplicações orientadas a objetos, a persistência permite que um objeto continue a existir mesmo após a destruição do processo que o criou. Na verdade, o que continua a existir é seu estado, já que pode ser armazenado em disco e então, no futuro, ser recriado em um novo objeto. O ciclo de vida de uma entidade pode ser constituído por quatro estados: new, managed, removed e detached, como mostrado na Figura 1.
Figura 1- Ciclo de Vida de Objetos Persistentes
Um objeto que se encontra no estado new pode ser definido como aquele que foi definido a partir do operador new e que não possui um valor para o seu identificador persistente, por exemplo, aquele com um ciclo de vida limitado ao tempo de vida do processo que o instanciou. Objetos neste estado também são conhecidos como objetos transientes. Em outras palavras, o objeto não está associado ao EntityManager.
Já um objeto no estado managed é aquele que tem um valor definido para o seu identificador persistente e está associado a um contexto de persistência. Assim, o EntityManager irá fazer com que a base de dados seja atualizada com novos valores dos atributos persistentes no fim da transação.
Por outro lado, existem objetos também associados a um contexto de persistência, porém que estão “marcados” para serem excluídos da base de dados no final da transação, e assim permanecendo no estado removed.
Por fim, também existem aqueles objetos que se encontram em um estado denominado detached, que possuem registros correspondentes na base de dados, mas não estão associados a um contexto de persistência.
A implementação da JPA é feita por um persistence provider ( provedor de persistência ) . O provedor define "como as coisas funcionam", através da implementação de todas as interfaces definidas pela especificação da JPA. Dessa forma cada provedor decide a maneira e o momento de carregar , atualizar e armazenar as entidades , assim como sincronizar os dados com o banco. As configurações utilizadas pelo provedor em uma determinada aplicação, tais como conexão com banco de dados , entidades que serão gerenciadas , tipo de transação , etc, são descritas em uma persistence unit que é configurada em um arquivo especial chamado persistence.xml.
[edit] Sobre o Ambiente utilizado no projeto
Eclipse 3.2
O Eclipse 3.2 foi o IDE escolhido para implementar o projeto. O download pode ser feito a partir de eclipse.org/downloads
MySQL
O banco de dados escolhido foi o MySQL e seu driver JDBC MySQLConector. O download pode ser feito a partir de dev.mysql.com/downloads
TopLink Essentials
O TopLink Essentials é a implementação da JPA utilizada no projeto GlassFish ( GlassFish.dev.java.net). O download pode ser feito a partir da pagina do projeto : oracle.com/technology/products/ias/toplink/jpa/download.html
[edit] Projeto Completo
Apresentação Persistência com JPA - Java Persistence API
[ http://rmarcell.brinkster.net/PersistenciaDeDados.zip ]
Projeto Completo implementando Design Pattern DAO + Persistencia JPA
[ http://rmarcell.brinkster.net/ProjetoPersistenciaDadosJPA.zip ]