Contexto de Persitência
No arquivo persistence.xml
podemos ter diversas unidades de persistência. Em cada unidade de persistência podemos configurar as entidades através do elemento class
.
<!-- As demais configurações foram omitidas-->
<persistence-unit name="exemploPU" transaction-type="RESOURCE_LOCAL">
<class>edu.ifpb.dac.Pessoa</class>
</persistence-unit>
Uma vez configuradas as entidades, para que as alterações nas entidades sejam refletidas no banco de dados a entidade precisa ser gerenciada por um Contexto de Persistência e a alteração necessita ser executada de forma transacional (ocorra dentro de uma transação).
O Contexto de Persistência é local onde um conjunto de instâncias das entidades será gerenciado. Em uma aplicação pode haver diversos contextos, sendo que cada contexto é gerenciado por um EntityManager
. O EntityManager
monitora todas as alterações realizadas nos objetos gerenciados. Entretanto, quando um contexto é fechado, todas as instâncias das entidades passam a não mais serem gerenciadas (desacopladas) e qualquer alteração realizada nesta entidade não é refletida no banco. Na Figura 1, podemos observar os possíveis estados que as entidades podem assumir.

Uma segunda imagem sobre o ciclo de vida.
O contexto de persistência pode possuir dois tipos de escopos: transação
e estendido
. O escopo vai definir o ciclo de vida de cada entidade.
Escopo de transação
Neste escopo, as entidades possuem um ciclo de vida que dura o tempo de uma transação. Após a transação, as instâncias gerencias pelo contexto são destruídas.
Só são contexto de persistência com escopo de transação, os contextos que são gerenciados por servidores aplicação.
Escopo estendido
Com este escopo, as entidades possuem um ciclo de vida que dura além de uma transação. Após a transação as instâncias gerencias são mantidas e continuam sendo gerenciadas pelo contexto.
Os contextos de persistência com escopo estendido, são utilizados em ambiente JSE e quando utilizados no ambiente JEE, devem ser gerenciados por um componente que possua escopo de sessão.
//Ambiente JEE
@PersistenceContext(unitName = "exemploPU", type = PersistenceContextType.EXTENDED)
EntityManager entityManager;
Contexto não sincronizado
EntityManager
O EntityManager
é um serviço responsável por gerenciar as entidades.

Geralmente, no ambiente JEE os gerenciados de entidades (EntityManager
) são injetados quando utilizamos a anotação @PersistenceContext
.
//Ambiente JEE
@PersistenceContext(unitName = "exemploPU")
EntityManager entityManager;
Quando utilizamos o gerenciado em um ambiente JSE, a instância do EntityManager
é recuperada a partir da classe Persistence
.
//Ambiente JSE
EntityManagerFactory emf = Persistence.createEntityManagerFactory("pessoaPU");
EntityManager em = emf.createEntityManager();
Segue uma listagem dos principais métodos do EntityManager
.
persist
:
- Grava uma entidade no Banco de Dados. Quando aplicado, a instância do objeto passa a ser gerenciada.
find
:
- Retorna
null
caso não encontre a entidade, carregando a entidade sob demanda (lazy-loading).
getReference
:
- Retorna um
EntityNotFoundException
, caso a entidade não seja encontrada e não garante o carregamento da entidade.
merge
:
- Sincroniza as alterações em entidades desacopladas com entidades no banco de dados.
- Se o objeto passado como parametro, no método
merge
não estiver sendo gerenciado, omerge
retorna um cópia do objeto de mesmoid
. - Se o objeto estiver sendo gerenciado, o
merge
copia-o no banco e retorna uma instância gerenciada desta entidade.
contains
:
- Recebe uma instância e se a instância for gerenciada, retorna true.
clear
:
- Desacopla todas as entidades do contexto de persistência. Todas as alterações na entidade são perdidas.
flush
:
- Utilizando
persist
,merge
ouremove
, as alterações não são realizadas automaticamente. Usandoflush
é forçada a sincronização. - FlushModeType:
- AUTO: Comportamento
default
. - COMMIT: Só é gravado quando a transação é confirmada.
- AUTO: Comportamento
métodos para consulta
:
createQuery(String queryString)
createNamedQuery(String name)
createNativeQuery(String sqlString)
createQuery(CriteriaQuery<T> criteriaQuery)