A necessidade de persistir e recuperar dados estão presentes em grande parte das aplicações, e para as aplicações escritas em Java não é diferente. Por isto, é de grande importância para todos os desenvolvedores saber como implementar ao menos uma forma de interação com o banco de dados.
O mecanismo de acesso a banco de dados mais baixo nível em Java é o JDBC (Java Database Connectivity), onde as instruções SQL devem ser formuladas por sua aplicação e transmitidas ao banco de dados.
Apesar de bastante poderoso, o JDBC se mostra bastante trabalhoso ao escrevermos grandes aplicações. Essa dificuldade é inerente ao fato de estarmos integrando dois paradigmas diferentes. Por um lado temos um paradigma focado em tabelas e instruções SQL nos bancos de dados, e por outro lado temos um paradigma orientado a objetos no Java. Buscando aproximar esses dois paradigmas, existe uma técnica conhecida como ORM (Object-Relational Mapping ou Mapeamento Objeto-Relacional), onde as tabelas do banco de dados são representadas através de classes e os registros de cada tabela são representados como instâncias das classes correspondentes.
Outra grande dificuldade que temos de enfrentar é que, apesar da padronização do SQL, cada banco tem suas peculiaridades, com instruções próprias e tipos de colunas diferentes, o que pode tornar bastante trabalhoso migrar de um banco para outro, dado que sua aplicação já está específica para um determinado banco.
Visando diminuir essa dificuldade de transição entre os bancos de dados, temos a JPA. Ela é uma API baseada no conceito de ORM e funciona como uma camada de abstração entre a aplicação e o banco de dados, possibilitando uma maior independência entre os mesmos.
Para obtermos os benefícios da JPA, podemos utilizá-la em nossa aplicação de duas formas: standalone ou em um ambiente Java EE. Denominamos standalone quando não necessitamos do gerenciamento de um container, como um servidor de aplicação.
Este artigo tem como objetivo auxiliar nos primeiros passos com a JPA sem necessidade de conhecimento prévio da plataforma Java EE e, por conta disso, nosso foco será na utilização standalone, mas com um tópico dedicado às diferenças entre essas duas formas de utilização.
Com a mesma premissa de não exigir conhecimento prévio do leitor, vamos utilizar um banco de dados em nossos exemplos que é extremamente simples de configurar, o HSQLDB. No decorrer do artigo, sua configuração e utilização serão detalhadas.
Em nossos exemplos, vamos utilizar a classe Pessoa como objeto de estudo. Primeiramente, veremos como mapear nossas entidades, que são as classes que representam a estrutura do nosso banco de dados. Depois, veremos como persistir nossas entidades no banco e, por fim, como resgatá-las.
Os conceitos apresentados nesse artigo não se restringem a uma determinada IDE, mas com o intuito de facilitar o entendimento, nas seções de configuração iremos utilizar o Eclipse, cujo link para download pode ser encontrado na seção Links.
Além da JPA, iremos utilizar o framework Hibernate, que é uma implementação da JPA. A relação entre Hibernate e JPA merece atenção especial e será o tema do nosso primeiro tópico.
Diferenças entre JPA e Hibernate
A JPA é uma API, ou seja, uma especificação de como uma aplicação deve utilizar determinados recursos sem estabelecer os detalhes de como esses recursos devem funcionar internamente. Em nosso caso, a JPA define como devemos fazer o mapeamento de nossas classes, utilizando suas annotations, e define também quais métodos devem ser invocados para determinados procedimentos, como por exemplo, inserir um registro no banco de dados, mas não define como implementar esses métodos.
De um ponto de vista mais prático, a JPA é um conjunto de annotations e interfaces Java, mas não contém as classes que implementam essas interfaces.
O Hibernate, por outro lado, é um framework. Ele é quem de fato implementa os procedimentos que a JPA define. Existem outras implementações da JPA, como EclipseLink e OpenJPA, mas estas são bem menos populares do que o Hibernate. É relevante ressaltar que o fato do Hibernate implementar as especificações da JPA não impede o framework de ter recursos que a não JPA não tenha.
Um comitê da Java EE é responsável pela evolução da JPA, como a que ocorreu em maio de 2013 com o lançamento da JPA 2.1, juntamente com a Java EE 7. A cada vez que uma nova
versão da especificação é lançada, as div ...