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.

Ciclo de vida de uma entidade
Figure: Ciclo de vida de uma entidade

Uma segunda imagem sobre o ciclo de vida.

Ciclo de vida de uma entidade

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.

Ciclo de vida de uma entidade
Figure: Ciclo de vida de uma entidade

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, o merge retorna um cópia do objeto de mesmo id.
  • 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 ou remove, as alterações não são realizadas automaticamente. Usando flush é forçada a sincronização.
  • FlushModeType:
    • AUTO: Comportamento default.
    • COMMIT: Só é gravado quando a transação é confirmada.

métodos para consulta:

createQuery(String queryString)
createNamedQuery(String name)
createNativeQuery(String sqlString)
createQuery(CriteriaQuery<T> criteriaQuery)

results matching ""

    No results matching ""