JPA - API Prof. Leandro Rubim [email protected] [email protected] Componentes Avançados Agenda JPA EntityManager Definições Contexto Persistência Obtendo um EntityManager Transações API EntityManager 2 JPA Conjunto de anotações para mapeamento O/R; API para persistência de entidades; Linguagem de consultas EJB-QL; Especificação independente de fabricante; Utilizaremos a implementação Hibernate: – Hibernate Core; – Hibernate Annotations; – Hibernate Entity Manager; 3 Entity Manager Unidade central para gerenciamento de entidades na JPA através de uma API padronizada; Responsável pela criação, atualização, remoção e consulta às entidades (CRUD); Controle de transações; Gerenciamento de cache; 4 Definições Unidade de Persistência: – conjunto fixo de classes mapeadas para o banco de dados (persistence.xml); Contexto de Persistência: – conjunto de instâncias de entidades gerenciadas de um Entity Manager; Entidades Gerenciadas: – quando entidades estão associadas a um contexto de persistência; – alterações no estado das entidades são sincronizadas com o banco de dados; – ao fechar um contexto de persistência, todas suas instâncias de entidades associadas tornam-se não gerenciadas; Entidades Não Gerenciadas: – entidades não associadas a um contexto de persistência (por exemplo quando são instanciadas); – alterações nas entidades não se refletem no banco de dados; 5 Contexto Persistência Ponte entre entidades na memória e banco de dados; Gerenciada por um Entity Manager; Entidade Contexto BD Entity Manager 6 Estados Entidade new instância da entidade criada em memória mas não associada a um contexto de persistência e não possui id equivalente no banco de dados; managed tem um id no banco de dados e está associada a um contexto de persistência; detached tem um id no bando de dados mas não está associada ao contexto de persistência; removed instância da entidade associada a um contexto de persistência mas está programada para ser removida do banco de dados; 7 Diagrama de Estado Entidade new() new refresh() persist() remove() removed managed persist() merge() •Contexto fechado •Commit •Serialização detached 8 Obtendo um EntityManager Utilizar a anotação @PersistenceContext para obter, via injeção de dependência, uma instância que implemente a interface EntityManager; Exemplo: public class ClienteBean ... { @PersistenceContext EntityManager manager = null; } 9 API EntityManager persist (Object entity): – enfileira entidade para ser inserida uma entidade no banco de dados e a torna gerenciada; – Exemplo: VeiculoEntity veiculo = new VeiculoEntity(); veiculo.setPlaca(“DHZ-5678”); veiculo.setModelo(“Fusca”); manager.persist(veiculo); 10 API EntityManager merge (Object entidade): – atualiza uma entidade não gerenciada no contexto de persistência; – Caso já exista uma entiade gerenciada com o mesmo id realiza uma operação de UPDATE; – Caso contrário realiza uma operação de INSERT; – A entidade torna-se gerenciada; – Exemplo: VeiculoEntity veiculo = new VeiculoEntity(); veiculo.setPlaca(“DHZ-5678”); veiculo.setModelo(“Fusca”); manager.merge(veiculo); 11 API EntityManager refresh (Object entidade): – Atualiza dados da entidade com base no banco de dados; – Valores não persistidos são descartados; – A entidade torna-se gerenciada; – Exemplo: VeiculoEntity veiculo = new VeiculoEntity(); veiculo = manager.find(VeiculoEntity.class, 1); veiculo.setPlaca(“DHZ-5678”); veiculo.setModelo(“Fusca”); manager.refresh(veiculo); 12 API EntityManager find (Class classeEntidade, Object PK): – localiza uma entidade através de sua chave primária (PK); – Retorna null caso a entidade não seja localizada; – Uma entidade localizada torna-se automaticamente gerenciada; – Exemplo: // Busca veiculo com id igual a 10 VeiculoEntity veiculo = manager.find(VeiculoEntity.class, 10); veiculo.setPlaca(“HHH-7777”); 13 API EntityManager remove (Object entidade): – Remove uma entidade acoplada; – Para excluir entidades desacopladas primeiro deve-se localizá-la através do método find ou getReference; – Exemplo: VeiculoEntity veiculo = manager.find(VeiculoEntity.class, 10); manager.remove(veiculo); 14