Java JPA: A evolução da persistência em Java

Este artigo apresenta a evolução da Java Persistence API (JPA), solução de Mapeamento Objeto-Relacional padrão da plataforma Java EE. Por meio de algumas demonstrações, vamos analisar as novidades da especificação da JPA versão 2.1.

Fique por dentro

Este artigo apresenta a evolução da Java Persistence API (JPA), solução de Mapeamento Objeto-Relacional padrão da plataforma Java EE. Por meio de algumas demonstrações, vamos analisar as novidades da especificação da JPA versão 2.1, que traz novas funcionalidades que aumentam o nível de flexibilidade no desenvolvimento de soluções e facilitam o uso de recursos oferecidos pelos Sistemas Gerenciadores de Banco de Dados.

A abordagem feita no artigo é útil para familiarizar o leitor com a evolução da especificação JPA, permitindo o conhecimento rápido e a utilização das novas funcionalidades incorporadas que tornam mais produtivo o desenvolvimento em Java envolvendo persistência de dados.

Grande parte das aplicações desenvolvidas, sejam estas simples ou complexas, compartilham um denominador comum, a informação. A informação criada e/ou manipulada pelas aplicações na maioria das vezes precisa ser armazenada para utilização no futuro. Alguns exemplos destas informações são: um cadastro preenchido em uma loja virtual, que é reaproveitado em todas as compras realizadas pelo cliente; ou os registros de transações bancárias, que são a base para a geração e conferência do extrato contendo a movimentação efetuada em uma conta.

Um meio comum para o armazenamento de informações são os SGBDs (Sistemas Gerenciadores de Banco de Dados). Os SGBDs armazenam informações em um modelo relacional que se baseia em conceitos como: tabelas, colunas, linhas, chaves primárias (coluna(s) com valor(es) que identificam unicamente uma linha em uma tabela) e chaves estrangeiras (coluna(s) com valor(es) que referenciam linhas da mesma ou de outras tabelas).

No entanto, as aplicações desenvolvidas em Java, diferentemente dos SGBDs, utilizam o modelo orientado a objetos para representar as informações. Este modelo aplica conceitos como classes, objetos, atributos, associações entre um ou mais objetos, métodos e herança.

Pelos conceitos descritos anteriormente podemos notar que o modelo relacional e o modelo orientado a objetos são incompatíveis entre si. Deste modo, para que exista interação entre eles é necessário um mecanismo intermediador, o ORM (Object-Relational Mapping). Este mecanismo provê a conversão das informações existentes em um modelo de dados relacional para o orientado a objetos e vice–versa. Esta conversão é possível através do mapeamento ORM, que descreve a correspondência entres esses dois modelos.

A JPA (Java Persistence API) é a solução ORM padrão para as plataformas Java SE e Java EE. Sua criação e consequentes atualizações efetuadas foram e são estabelecidas seguindo o mesmo procedimento de evolução das tecnologias da plataforma Java, através de especificações. Uma especificação é elaborada por meio de uma JSR (Java Specification Request), que consiste em uma proposta formal e estabelece quais e como os recursos serão oferecidos, além de determinar o comportamento esperado destes nas implementações. Com a aprovação da JSR por um comitê executivo, a nova versão da especificação é liberada.

Em consequência da aprovação da JSR 338, a versão 2.1 da especificação JPA foi liberada em Maio de 2013. Esta nova versão da API é o tema central deste artigo, e vamos abordar este assunto com uma breve descrição da motivação para criação da JPA, seguindo com um resumo das atualizações realizadas na versão 2.0, e através de um conteúdo mais amplo, a apresentação e demonstração das novidades incorporadas na especificação atual, que corresponde à versão 2.1.

A evolução da JPA

A motivação para criação da JPA surgiu da necessidade de simplificar o modelo de persistência disponível na plataforma EJB 2.x, o CMP. Os recursos oferecidos pelo CMP eram altamente acoplados e dependentes do ambiente oferecido pelo container. Esta dependência implicava no desenvolvimento de uma quantidade de código considerável que era requerida para o funcionamento da persistência, a saber:

· Criação das interfaces de componentes que definem os métodos de negócio para manipulação das informações persistidas. Estas interfaces possibilitam o acesso remoto, estendendo a interface javax.ejb.EJBObject, e o acesso local, estendendo a interface javax.ejb.EJBLocalObject;

· Criação das interfaces home, que devem estender as interfaces javax.ejb.EJBHome para acesso remoto e javax.ejb.EJBLocalHome para acesso local. Estas interfaces são utilizadas pelo container como fábrica na criação dos componentes que irão possibilitar o acesso às informações persistidas;

· Implementação abstrata da interface javax.ejb.EntityBean, que é utilizada pelo container e permite o acesso aos dados persistidos;

· Criação do arquivo ejb-jar.xml (descritor de deploy), contendo o mapeamento das propriedades das entidades (javax.ejb.EntityBean) e a descrição das consultas para obtenção e manipulação das informações persistidas.

JPA 1.0

Com a proposta de substituir este mecanismo de persistência “dependente” oferecido pelo CMP e tendo como base as soluções oferecidas por alguns frameworks de ORM disponíveis na época, a versão 1.0 da especificação JPA foi elaborada e integrou a JSR 220, liberada em Maio de 2006. Esta JSR definiu a versão 3.0 da tecnologia EJB (Enterprise Java Beans), que assim como a JPA, faz parte da plataforma Java EE 5. Nesta primeira versão da especificação estão inclusos os principais recursos da API, a saber:

· Regras e mecanismos para o mapeamento objeto-relacional, disponibilizando no pacote javax.persistence as anotações para uso nas entidades, e também fornecendo um esquema (XSD) para viabilizar o mapeamento via descritor XML;

· A definição da API EntityManager, contendo as operações básicas para persistência e recuperação de informações por meio das entidades;

· Uma linguagem para consulta e manipulação das entidades, a JPQL (Java Persistence Query Language);

· Conjunto de Listeners e Callbacks, para interceptação e tratamento de eventos ocorridos durante a manipulação das entidades.

JPA 2.0

A versão 2.0 da JPA foi concebida por meio da JSR 317, que aborda unicamente a evolução desta tecnologia, sendo liberada em Dezembro de 2009. Apesar desta separação em uma JSR própria, a API continuou a fazer parte da plataforma Java EE, na época na versão 6. Esta versão da JPA foi produzida com o propósito de atualizar a API em relação à versão 1.0, incluindo melhorias e novos recursos solicitados pela comunidade Java. Entre os aspectos introduzidos pela versão 2.0, destacam-se:

· Inclusão da API de Criteria, permitindo a construção de consultas através de recursos de orientação a objetos, uma alternativa à linguagem JPQL;

· Possibilidade do mapeamento de coleções de objetos simples, como Strings, Enumerações e objetos acoplados (Embedded);

· Tratamento de relacionamentos entre entidades nas operações de exclusão, com a remoção de dependências órfãs;

· Inclusão da API para cache de entidades.

JPA 2.1

A especificação da JPA 2.1, que no momento da escrita deste artigo é a versão mais atual da API, foi liberada em Maio de 2013 através da JSR 338. Esta nova especificação, que compõe a lista de tecnologias da plataforma Java EE 7, mantém o foco na atualização da API JPA, incorporando melhorias e novos recursos solicitados pela comunidade. A introdução e a demonstração de algumas das novidades da JPA versão 2.1 são a motivação e o assunto principal deste artigo, que irá avaliar os seguintes:

· Recurso para geração do esquema de banco de dados (Schema Generation);

· Expansão das alternativas de construção de resultados de consultas nativas com a utilização de tipos (classes) não persistidos, através da nova funcionalidade Constructor Result;

· Inclusão de suporte a Stored Procedures;

· Adição do mecanismo que permite a conversão entre os tipos utilizados nos atributos das entidades e os tipos das colunas referentes a estes atributos nas tabelas do banco de dados, os Converters;

· Evolução da API de Criteria, adicionando suporte à atualização e exclusão de dados em lote (bulk update/delete);

· Possibilidade de realização de cast explícito (downcasting) em consultas JPQL e Criteria com o uso do novo operador TREAT, aplicável em atributos de relacionamentos entre entidades que fazem parte de uma hierarquia de classes.

O modelo de classes para os exemplos

Para que a apresentação da nova versão da API JPA seja mais completa e não fique somente na suposição, foi desenvolvido um modelo de classes simples, no qual foi aplicado o mapeamento ORM por meio de anotações JPA. Este modelo de classes será usado como base para a apresentação e demonstração das novas funcionalidades da JPA.

Os trechos de código exibidos nas listagens deste artigo foram extraídos do desenvolvimento de exemplos com o uso da API JPA 2.1. Estes exemplos foram construídos com as tecnologias Java 7, a implementação de referência da JPA 2.1 fornecida pelo projeto EclipseLink (versão 2.5) e o banco de dados MySQL 5.5.31."

[...] continue lendo...

Artigos relacionados