Provedor de persistência JPA

Este texto entra para a lista dos que tentam explicar os conceitos trazidos pela Java Persistence API. Pretendo explicar o conceito de Provedor de persistência, qual o seu papel ao usar a JPA e como usar o Toplink ou o Hibernate em sua aplicação.

Como todo mundo já ficou sabendo a JPA não passa de um conjunto de interfaces e anotações que visam padronizar o acesso aos frameworks de mapeamento O/R. Desta forma foi criado um mercado para as empresas de “middleware” criarem suas próprias implementações.

O Provedor de Persistência é a implementação das interfaces existentes na JPA. Ele está para a JPA assim como o “driver do banco” está para a API JDBC.

Em ambos os casos o JCP define a API, isto é, a forma como os sistemas que nós criamos irão acessar as funcionalidades e os fornecedores implementam esta API. E nesta implementação as empresas podem trabalhar seus próprios conceitos de desempenho e otimização.

A Implementação de Referência, ou RI da sigla em inglês, é a desenvolvida pela Oracle para o servidor de aplicação Glassfish, e é baseada no Toplink(um framework de mapeamento O/R com mais de 10 anos de mercado). Sim ele concorre com o Hibernate neste mercado.

Para usar o Toplink como Provedor de Persistência em sua aplicação JPA, siga os passos:

  1. Entre na página de download da implementação da JPA;
  2. Baixe o arquivo glassfish-persistence-installer-v1_ur1-b14.jar;
  3. Execute o instalador: java -jar glassfish-persistence-installer-v1_ur1-b14.jar. O instalador irá descompactar as duas licenças e os arquivos, que você deverá adicionar no classpath da sua aplicação:
    • toplink-essentials.jar;
    • toplink-essentials-agent.jar;
  4. Use os atributos do Toplink no seu arquivo persistence.xml. Segue um exemplo do arquivo persistence.xml usando o Toplink acessando o banco de dados Derby.

Mais informações sobre o Toplink podem ser encontradas no site da Oracle, que é uma boa referência, uma vez que foram eles que o criaram.

Agora… Vou mostrar a vantagem do JCP definir apenas a interface….

Se você nunca ouviu falar de Toplink e se sente mais confortável com o Hibernate, por exemplo, bastaria mudar o arquivo persistence.xml para usar o Hibernate e colocar os pacotes dele no seu projeto, que são:

  • antlr-2.7.6.jar
  • asm.jar
  • cglib-2.1.3.jar
  • commons-collections-2.1.1.jar
  • commons-logging.jar
  • cos.jar
  • dom4j-1.6.1.jar
  • ehcache-1.2.3.jar
  • ejb3-persistence.jar
  • hibernate3.jar
  • hibernate-annotations.jar
  • hibernate-entitymanager.jar
  • javassist.jar
  • jboss-archive-browsing.jar
  • jta.jar

Antes que você tenha uma síncope nervosa, todos esses arquivos são encontrados no pacote: Hibernate EntityManager(que já vem com os pacotes do Hibernate Annotations) e no Hibernate Core. Ambos estão no site do projeto, na parte onde é explicado o uso do Hibernate como um Provedor de Persistência.

Assim é possível trocar a implementação do provedor de persistência sem tocar no seu código fonte 🙂

P.S.: Os arquivos persistence.xml estão com estensão doc porque o WordPress não deixa eu fazer upload de arquivo xml.

O que eu não gosto na Java Persistence API

A JPA é uma sacada fantástica do JCP. Já tem algum tempo que os Entity Beans são odiados pelos desenvolvedores. Principalmente depois do amadurecimento, comercial, do Hibernate.

Mas ainda faltam alguns detalhes, que o pessoal precisa dar atenção. O que mais me incomodou no JPA foi a falta, nos relacionamentos, da deleção das entidades órfans. O que se resolve, com o Hibernate Annotations, assim:

@Cascade (value={org.hibernate.annotations.CascadeType.ALL , org.hibernate.annotations.CascadeType.DELETE_ORPHAN })

Tem um tópico no GUJ falando disso…

Não teria sido mais fácil definir o JSR como o incluir o Hibernate Core/EntityManager/Annottations?

O que eu quero dizer é colocar o JPA v1.0 como o Hibernate(Core/EntityManager/Annottations) 3.2, e então, ir se adequando para permitir a implementação feita pelo Toplink, JDO e afins….

Para terminar, a idéia deste texto saiu do anúncio feito pelo Urubatan sobre as novidades do JPA 2.0.

Java Persistence API – JPA

Criada para ser o padrão de persistência e mapeamento Objeto-Relacional, a Java Persistence API – JPA – foi concebida na mesma JSR, de número 220, que definiu a nova versão dos Enterprise JavaBeans.
Com preocupações sobre a evolução desta API, existe a expectativa de se criar uma JSR exclusiva para ela. Mas, ainda, não existe nada de concreto neste sentido.

Originalmente a idéia era simplificar a especificação dos EJBs Entity Beans do tipo CMP(Container Managed Persistence), daí a JPA ter sido desenvolvido na mesma JSR dos EJB. Porém, o Expert Group percebeu que seria melhor fazer uma especificação seguindo o estilo dos frameworks de persistência disponíveis no mercado: Hibernate, Toplink e JDO. Unindo as melhores idéias em cada um deles. O que motivaria a criação de uma nova JSR.

Se você tiver um ambiente de produção com uma JVM atualizada para a versão 5 é uma das melhores atualizações que podem ser utilizadas nos seus próximos sistemas 🙂

Antes de escrever um tutorial sobre o assunto, vou listar alguns dos tutoriais que eu já li para implementar meu primeiro sistema com a JPA:

  1. An Introduction to Java Persistence for Client-Side Developers: Explica de forma clara como funciona a API usando como exemplo uma agenda. É um ótimo ponto de partida para conhecer a especificação e ter alguma coisa rodando. Utiliza a implementação TopLink Essentials;
  2. More Persistence for Client-Side Developers: Continuação do artigo anterior explica conceitos sobre o ciclo de vida dos objetos no EntityManager e fala sobre relacionamentos entre objetos. Utiliza a implementação Hibernate;
  3. Persistence Pays Offs: Advanced Mapping with JPA: Explicações mais avançadas sobre mapeamento. Herança e associações * * são abordadas neste artigo.

  4. Using Composite Keys with JPA: Tutorial sobre mapeamento de chave primária composta. Recomendado apenas quando o banco de dados já existe.
  5. TopLink JPA: Tutorial da Oracle. Utiliza a implementação TopLink Essentials, que é a Implementação de Referencia(RI), e está disponível junto com o novo servidor de aplicações JEE – GlassFish;
  6. Eclipse DALI: Plugin do Eclipse para auxiliar na utilização do JPA. Tem uns links para os tutoriais dos provedores de persistência.
  7. Managing JPA Entity Mappings: Tutorial desenvolvido pela BEA para mostrar o suporte visual dado pelo Workshop Studio para o desenvolvimento de aplicações de JPA.
  8. The Java Persistence API – A Simpler Programming Model for Entity Persistence: Comparação entre a versão anterior do EJB EntityBean CMP e a JPA apresentada pela Sun Microsystem.
  9. Field- vs. Property-Based access in JPA: Uma reflexão, feita por Adam Bien, sobre a forma de acesso aos atributos da entidade pelo EntityManager;
  10. Property Based Access in JPA – is an Emerging Antipattern: Crítica a utilização de anotações JPA feita em métodos getXXX(), também conhecido por Propety Based Access.
  11. Using Java Web Start with the Java Persistence API: Usando JPA com JavaWebStart.

[],
AC