API de Persistência Java (JPA)
A Persistência de dados é um meio para que um aplicativo persista e recupere informações de um sistema de armazenamento não volátil. A Java™ Persistence API (JPA) oferece um mecanismo para gerenciar a persistência e o mapeamento objeto-relacional e está em vigor desde as especificações EJB 3.0.
Para obter informações sobre como usar o JPA 2.1 e versões posteriores com o Liberty, consulte o site Open Liberty.
A persistência é vital para os aplicativos corporativos por causa do acesso necessário aos bancos de dados relacionais. Os aplicativos que forem desenvolvidos para este ambiente devem gerenciar a persistência por si só ou usar soluções de terceiros para manipular as atualizações e recuperações do banco de dados com persistência.
A especificação JPA define o mapeamento relacional de objetos internamente, em vez de depender das implementações de mapeamento específicas do fornecedor. A JPA é baseada no modelo de programação Java que se aplica aos ambientes do Java Enterprise Edition (Java EE), mas a JPA pode funcionar dentro de um ambiente do Java SE para testar funções de aplicativo.
A JPA representa uma simplificação do modelo de programação de persistência. A especificação JPA define explicitamente o mapeamento relacional de objetos, em vez de depender das implementações de mapeamento específicas do fornecedor. A JPA padroniza a importante tarefa de mapeamento relacional de objetos utilizando anotações ou o XML para mapear objetos para uma ou mais tabelas de um banco de dados. Para simplificar ainda mais o modelo de programação de persistência:
- A API EntityManager pode persistir, atualizar, recuperar ou remover objetos de um banco de dados.
- A API EntityManager e os metadados de mapeamento de objeto relacional manipulam a maioria das operações do banco de dados sem requerer que você grave o código JDBC ou SQL para manter a persistência.
- A JPA fornece uma linguagem de consulta, ampliando a linguagem de consulta EJB independente (também conhecida como JPQL), que pode ser usada para recuperar objetos sem gravar consultas SQL específicas para o banco de dados com o qual você está trabalhando.
A JPA foi projetada para operar dentro e fora de um contêiner Java Enterprise Edition (Java EE). Ao executar a JPA em um contêiner, os aplicativos podem usar o contêiner para gerenciar o contexto de persistência. Se não houver contêiner para gerenciar a JPA, o aplicativo deverá manipular o gerenciamento do contexto de persistência sozinho. Os aplicativos projetados para persistência gerenciada por contêiner não exigem muita implementação de código para tratar a persistência, mas esses aplicativos não podem ser utilizados fora de um contêiner. Aplicativos que gerenciam sua própria persistência podem funcionar em um ambiente de contêiner ou ambiente Java SE.
Os contêineres Java EE que suportam o modelo de programação EJB 3.x devem suportar uma implementação JPA, também chamada provedor de persistência. Um provedor de persistência JPA usa os elementos a seguir para permitir um gerenciamento de persistência mais fácil em um ambiente do EJB 3.x:
- Unidade de persistência
- Define um Modelo de objeto relacional completo que mapeia as classes Java (entidades + estruturas de apoio) com um banco de dados relacional. O EntityManagerFactory utiliza esses dados para criar um contexto de persistência que possa ser acessado por meio do EntityManager.
- EntityManagerFactory
- Usado para criar um EntityManager para interações com o banco de dados. Os contêineres do servidor de aplicativos normalmente fornecem essa função, mas o EntityManagerFactory será necessário se você estiver utilizando a persistência gerenciada pelo aplicativo JPA. Uma instância de um EntityManagerFactory representa um contexto de Persistência.
- Contexto de persistência
- Define o conjunto de instâncias ativas que o aplicativo está manipulando atualmente. É possível criar o contexto de persistência manualmente ou por meio de injeção.
- EntityManager
- O gerenciador de recursos que mantém a coleção ativa de objetos de entidade que estão sendo usados pelo aplicativo. O EntityManager manipula a interação do banco de dados e os metadados para mapeamentos de objetos relacionais. Uma instância de um EntityManager representa um contexto de Persistência. Um aplicativo em um contêiner pode obter o EntityManager por meio de introdução no aplicativo ou consultando-o no espaço de nomes de componentes Java. Se o aplicativo gerenciar sua persistência, o EntityManager será obtido do EntityManagerFactory.
- Objetos de entidade
- Uma classe Java simples que representa uma linha em uma tabela de banco de dados em sua forma mais simples. Os objetos de entidade podem ser classes concretas ou abstratas. Elas mantêm os estados utilizando propriedades ou campos.
API de Persistência Java e Contextos de Transação Local
O WebSphere fornece contextos de transação global e local a componentes gerenciados. Fornecendo esses contextos para componentes gerenciados e tendo encadeamentos para componentes gerenciados de serviço, uma transação está sempre ativa seja para um contexto de transação global (GTC) ou um contexto de transação local (LTC).
Este processamento não tem efeito em contextos de persistência gerenciados por aplicativo que são JPA EntityManagers adquiridos por meio de EntityManagerFactories injetados em um aplicativo com @PersistenceUnit. Porém, esse processamento pode afetar os Contextos de Persistência Gerenciados por Contêiner (CMTS), ou seja, os EntityManagers JPA injetados por meio de @PersistenceContext. Os métodos da API de JPA requerem que uma TransactionRequiredException seja lançada quando chamada fora dos limites de um GTC e essa exceção ainda é lançada conforme o esperado. No entanto, enquanto o LTC permanece ativo e até que um novo GTC seja iniciado ou o final da invocação do serviço de componente seja alcançado, o contexto de persistência CMTS permanece ativo. As entidades que são buscadas usando localizar ou consultar por um EntityManager de CMTS dentro dos limites de um LTC ainda são gerenciadas por esse contexto de persistência, em vez de se tornarem imediatamente desanexadas. Como resultado desse processamento, que pode parecer um comportamento inesperado e uma diferença de comportamento com alguns guias de programação JPA, o contexto de persistência que é mantido ativo pelo LTC é descartado assim que o GTC é iniciado e as entidades gerenciadas por esse contexto de persistência se desanexar.