• Nenhum resultado encontrado

Aula 03

N/A
N/A
Protected

Academic year: 2021

Share "Aula 03"

Copied!
30
0
0

Texto

(1)

EntityManager

(2)

EntityManager

• Vamos aprender sobre o ciclo de vida de entidades e como o EntityManager pode ser usado para realizar operações CRUD.

Lembrando que a interface EntityManager define a API para persistência, enquanto as entidades JPA especificam como os dados da aplicação são mapeados para um banco de dados relacional.

(3)

EntityManager

A interface EntiyManager tem o papel de interpretar o mapeamento O/R especificado para uma entidade e salvar a entidade no banco de dados. • Vamos agora conhecer os principais métodos dessa interface.

(4)

EntityManager

Method signature Description

public void persist(Object entity); Saves (persists) an entity into the database and makes the entity managed.

public <T> T merge(T entity); Merges an entity to the EntityManager’s persistence context and returns the merged entity.

public <T> T find(Class<T> entityClass, Object primaryKey);

Finds an entity instance by its primary key. This method is overloaded and comes in different forms.

public void flush(); Synchronizes the state of entities in the EntityManager’s persistence context with the database.

public void setFlushMode(FlushModeType flushMode); Changes the flush mode of the EntityManager’s persistence context. The flush mode may be AUTO or COMMIT. The default flush mode is AUTO, meaning that the EntityManager tries to automatically sync the entities with the database.

(5)

EntityManager

Method signature Description

public FlushModeType getFlushMode(); Retrieves the current flush mode.

public void refresh(Object entity); Refreshes (resets) the entities from the database. This method is overloaded and comes in different forms. public Query createQuery(String jpqlString); Creates a dynamic query using a JPQL statement. This

method is overloaded and comes in different forms. public Query createNamedQuery(String name); Creates a query instance based on a named query on

the entity instance. This method is overloaded and comes in different forms.

public Query createNativeQuery(String sqlString); Creates a dynamic query using a native SQL statement. This method is overloaded and comes in different forms. public StoredProcedureQuery

createStoredProcedureQuery(String procedureName);

Creates a StoredProcedureQueryfor executing a stored procedure. This method is overloaded and comes in different forms.

(6)

EntityManager

Method signature Description

public void close(); Closes an application-managed EntityManager. public void clear(); Detached all managed entities from the persistence

context. All changes made to entities not committed will be lost.

public boolean isOpen(); Checks whether an EntityManager is open.

public EntityTransaction getTransaction(); Retrieves a transaction object that can be used to manually start or end a transaction.

public void joinTransaction(); Asks an EntityManager to join an existing JTA transaction.

(7)

O Ciclo de Vida de Uma Entidade

O EntityManager nada sabe sobre um POJO, até que você diga ao manager para começar a tratar o POJO como um entidade JPA.

Uma entidade sob o controle do EntityManager é considerada anexada (attached) ou gerenciada (managed).

Por outro lado, quando um EntityManager para de gerenciar uma entidade, a entidade é dita desanexada (detached).

(8)
(9)

Entidades Gerenciadas (Managed)

O EntityManager assegura que os dados das entidades estejam sincronizadas com o banco de dados.

Quando o EntityManager inicia o gerenciamento de uma entidade, ele sincroniza o estado dela com o banco de dados.

Além disso, o EntityManager garante que alterações feitas nos dados da entidade sejam refletidas no banco de dados.

• Uma entidade torna-se gerenciada quando ela é passada como parâmetro dos métodos persist, merge, ou refresh.

Quando recuperada através do método find ou através de queries, a entidade também torna-se gerenciada.

(10)

Entidades Desanexada (Detached)

É uma entidade que não é mais gerenciada pelo EntityManager.

• Não há garantia de que o estado da entidade esteja em sincronia com o banco de dados.

Uma chamada ao método remove do EntityManager, por exemplo, torna uma entidade desanexada.

Ao invocar o método clean todas as entidades gerenciadas pelo EntityManager passam a ser desanexadas.

(11)

Contextos de Persistência, Escopo e

EntityManager

• O escopo de persistência é a duração de tempo que um determinado conjunto de entidades permanece gerenciado.

• Um contexto de persistência é uma coleção de entidades independentes gerenciadas por um EntityManager durante um determinado escopo de persistência.

Há dois tipos de escopos de persistência: de transação (transaction) e estendido (extended).

(12)

Escopo de Transação

Um EntityManager associado ao contexto de persistência de um escopo de transação é conhecido como EntityManager

transaction-scoped.

• Se um contexto de persistência estiver sob o escopo de transação, as entidades agregadas durante uma transação serão

automaticamente desanexadas quando a transação finalizar (com sucesso ou com falha).

(13)

Escopo Estendido

Conhecido como extended-scoped

EntityManager somente pode ser

utilizado com stateful session beans. • O tempo de vida de um

EntityManager estendido ultrapassa

múltiplas transações.

• O tempo em que as entidades permanecem gerenciadas não tem geração alguma com limites de

transação. As entidades permanecem gerenciadas enquanto o

(14)

Operações de Persistência

Vamos realizar as operações de inserção, recuperação, atualização e deleção (CRUD) utilizando o EntityManager.

• Todas as operações de persistência devem ser invocadas dentro do escopo de uma transação. Se uma transação não está presente quando um método de persistência é invocado, é lançada a transação TransactionRequiredException.

(15)
(16)
(17)
(18)

Recuperando Entidades Pelo Id

• Observe que, se uma instância de entidade com a chave informada não existir no banco de dados, o método find não vai levantar exceção.

Em vez disso, será retornado null e seu aplicativo deve lidar com essa situação.

Não é estritamente necessário chamar o método find em um contexto transacional. Mas a entidade recuperada estará detached a menos que um contexto de transação esteja disponível, por isso é aconselhável para chamar o método find dentro de uma transação.

Se o seu provedor de persistência suporta caching e a entidade já existe na cache, então o EntityManager retorna a instância em cache da entidade em vez de recuperá-la a partir do banco de dados.

(19)

Lendo Entidades Relacionadas

O EntityManager normalmente carrega todos os dados de instância da entidade quando uma entidade é recuperada a partir do banco de dados.

Como já vimos, existem dois tipos de fetch: FetchType.EAGER e FetchType.LAZY.Carregamento preguiçoso (FetchType.LAZY) é uma característica opcional, o que

(20)
(21)
(22)

Atualizando

Entidades

Dentro de uma transação, não é necessário chamar

explicitamente métodos para atualizar objetos que estejam gerenciados.

Ao realizar o commit na transação, o provedor de persistência irá atualizar os objetos modificados.

(23)

Atualizando

Entidades

Caso o objeto não seja gerenciado, é necessário

chamar o método merge para que ele passe a ser gerenciado e, assim, a instância possa ser atualizada na base de dados. Quando invocamos o merge em comprador, devido ao mapeamento

(CascadeType.ALL), é realizado também o merge em cartão de crédito.

(24)
(25)

Efeito de vários

valores de

CascadeType

Valor de CascadeType Efeito

CascadeType.MERGE Somente operações

EntityManager.merge são

propagadas para entidades relacionadas.

CascadeType.PERSIST Somente operações

EntityManager.persist são

propagadas para entidades relacionadas.

CascadeType.REFRESH Somente operações

EntityManager.refresh são

propagadas para entidades relacionadas.

CascadeType.REMOVE Somente operações

EntityManager.remove são

propagadas para entidades relacionadas.

CascadeType.ALL Todas as operações são propagadas para entidades relacionadas.

(26)

Removendo

Entidades

Para remover entidades, utilize o método remove do

EntityManager.

Dê atenção especial aos relacionamentos, mais especificamente no

CascadeType.

Para ocorrer a remoção de uma entidade relacionada, é

necessário CascadeType.ALL ou

(27)

Entity Queries

• Com JPA você tem várias opções diferentes para consulta de dados, que vão desde JQL à Criteria API, SQL nativas e stored procedures. Cada uma das opções tem suas próprias vantagens e desvantagens, dependendo do que você está tentando fazer.

(28)

Entity Queries

Tipos de Queries Descrição

javax.persistence.Query Representa ou uma query JPQL ou uma query SQL nativa. Se uma query é tipada, uma instância de javax.persistence.TypeQuery <T> é retornada, eliminando assim a necessidade de realizar casts. javax.persistence.StoredProcedureQuery Representa uma query que invoca uma stored

procedure.

javax.persistence.criteria.CriteriaQuery Representa uma query que é construída usando o meta-modelo de objetos.

(29)

Entity Queries

(30)

Entity Queries

Named Queries: precisam ser definidas com a anotação @NamedQuery e são

Referências

Documentos relacionados

Portanto, mesmo percebendo a presença da música em diferentes situações no ambiente de educação infantil, percebe-se que as atividades relacionadas ao fazer musical ainda são

No sentido de reverter tal situação, a realização deste trabalho elaborado na disciplina de Prática enquanto Componente Curricular V (PeCC V), buscou proporcionar as

Os casos não previstos neste regulamento serão resolvidos em primeira instância pela coorde- nação do Prêmio Morena de Criação Publicitária e, em segunda instância, pelo

Como já foi dito neste trabalho, a Lei de Improbidade Administrativa passa por uma releitura doutrinária e jurisprudencial, visando delimitar de forma precisa os tipos ímprobos,

RESUMO Esse trabalho bioprospectivo com abordagem etnodirigida levou em consideração o conhecimento dos vendedores de plantas medicinais em uma região do Nordeste brasileiro

Por isso na década de 1960 a prefeitura resolve criar não só o baile, mas também o chamado Voo do Frevo, que tinha por objetivo não só trazer artistas do sul e do sudeste do país

Next, we apply the nonparametric estimation to US and Brazilian data and estimate how the yield of a long-term zero-coupon bond responds to the initial state of the economy.. Using

Membro_Faculdade (Matrícula: Inteiro, Nome: string[50], Carga: Inteiro, IniContrato: data, Curso: string[30], professor: booleano, aluno: booleano). Membro