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.
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
-
Artigo
-
Artigo
-
Artigo
-
Artigo
-
Artigo