Jpa _ Java Persistence Api - Mgjug - Adrianotavares

  • July 2020
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Jpa _ Java Persistence Api - Mgjug - Adrianotavares as PDF for free.

More details

  • Words: 2,653
  • Pages: 67
JPA – Java Persistence API Persistência para aplicações Java SE e Java EE

Adriano de Pinho Tavares Consultor / Arquiteto de Sistemas [email protected]

2

Palestrante • Adriano de Pinho Tavares > > > > >

Especialista em Engenharia de Software pela UFMG Bacharel em Ciência da Computação pela PUCMINAS SCJA 1.0, SCJP 1.4, SCEA (part 1) Membro Fundador do MGJUG Consultor/Arquiteto de Sistemas - Squadra Tecnologia

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

3

Agenda Geral • • • •

Conceitos de mapeamento objeto/relacional (ORM) Introdução à JPA – Java Persistence API Eclipse Web Tools Platform Project 2.0 Demo Dali

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

Conceitos de mapeamento objeto/relacional (ORM)

5

O que é mapeamento Objeto/Relacional (ORM)? • Mecanismo sofisticado para mapeamento de objetos Java em memória, para tabelas do banco de dados • Permite persistir objetos em banco de dados relacionais • Permite pesquisas complexas • Permite debug e auditoria(log) das operações entre a aplicação e o banco de dados MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

6

O que é mapeamento Objeto/Relacional (ORM)? • Cada instância de objeto corresponde a um registro no banco de dados

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

7

Agenda JPA • JPA Requisitos de persistência • JPA Modelo de programação • Ciclo de vida de entidade e Gerente de Entidade • Entidades Desacopladas • Relacionamentos entre entidades • Mapeamento Objeto/Relacional • Listeners de entidades • Consultas (Query) • Transações MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

JPA Requisitos de persistência

9

JPA Requisitos de persistência • Simplificação do modelo de persistência • Modelo de persistência leve (Light-weight) > Simplificação do modelo de programação e publicação > Melhoria de desempenho do ambiente de execução

• Testabilidade fora dos containers > Criação de clientes de testes usando entidades independentes

dos containers

• Modelagem de domínio permitindo herança e polimorfismo • Mapeamento Objeto/Relacional • Melhoria das capacidades de pesquisa MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

10

Persistência para Java SE e Java EE • Finalmente um consenso! > Padronização do mapeamento O/R > Fusão de experiência dos criadores do Hibernate, JDO,

TopLink, fornecedores EJB e participações individuais > Suporte para implementações de persistência plugáveis, de diferentes fornecedores (análogo ao JDBC)

• Uso em containers Java EE e em ambiente Java SE

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

JPA Modelo de programação

12

Origem do termo entidade • O termo “Entidade” foi usado pela primeira vez em 1976 quando Peter Chen propôs o modelo clássico de Entidade-Relacionamento em um dois papers que mais influenciaram a ciência da computação > “The Entity-Relationship Model – Toward a Unified View of

Data” ACM Transactions on Database Systems, Março 1976

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

13

Entidade na JPA • Entidade é o objeto que pode ser gravado pelo mecanismo de persistência • Entidades não são EJBs > São puramente locais e não podem ser acessadas

diretamente de forma remota como os Entity Beans 2.x

• Toda entidade tem de ter um construtor sem argumentos • Toda entidade tem de ter uma chave primária

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

14

Chave primária • Chave primária pode ser simples ou composta • Chave primária pode ser mapeada para campo ou propriedade @Id private Long id;

@Id public Long getId() { return id; }

• Suporte a chaves compostas > Deve ser definida uma classe para representar chave

composta

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

15

Entidade na JPA (cont.) • Uma entidade JPA é um POJO anotado // @Entity é uma anotação // ela define a classe Cliente como uma // entidade persistente @Entity public class Cliente { // atributos persistentes/transientes // métodos de acesso // métodos com lógica de persistência }

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

16

Exemplo inicial em Java EE @Entity public class Cliente {

@Id define chave primária

@Id private Long id; private String nome; private Endereco endereco; private Collection pedidos = new HashSet(); // construtor sem argumentos public Cliente() {} public Long getId() { return id; } protected void setId (Long id) { this.id = id; } ... MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

Getters/setters para acessar o estado interno

17

Exemplo inicial em Java EE (cont.) ... Define relacionamento 1:n com tabela Pedido @OneToMany public Collection getPedidos() { return pedidos; } public void setPedidos(Collection pedidos) { this.pedidos = pedidos; } // Outros métodos de negócio ... }

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

18

Exemplo inicial em Java EE (cont.) @Stateless public class CadastrarPedidos { // Injeção de dependência para Gerente de Entidade // definindo um contexto de persistência @PersistenceContext(name=”persistCxt”) EntityManager em; public void inserirPedido(int idCliente, Pedido novoPedido){ // Uso do método find para buscar a entidade cliente Cliente c = em.find(Cliente.class, idCliente); // Insere um novo pedido c.getPedidos().add(novoPedido); novoPedido.setCliente(c);

}

} // outros métodos de negócio

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

Ciclo de vida de entidade

20

Ciclo de vida de entidade • New – Criada usando a palavra-chave new – Não tem id persistente

• Managed – Tem um id persistente associado a um contexto de persistência

• Removed – Tem um id persistente associado a um contexto de persistência – Está escalonada para ser excluída do banco de dados

• Detached – Tem um id persistente, mas não está associada com um contexto de persistência MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

21

EntityManager • Similar à funcionalidade do Hibernate Session, controla o ciclo de vida das entidades • new() – Cria uma nova entidade

• persist() – Persiste uma entidade

• refresh() – Atualiza o estado da entidade

• remove() – Marca uma entidade para remoção

• merge() – Sincroniza o estado de entidades desacopladas MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

22

EntityManager • Fabrica de objetos Query > createQuery() > cria uma instancia de query usando EJB QL > createNamedQuery() > cria uma instancia de query nomeada > createNativeQuery() > cria uma instancia de query usando SQL

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

23

Exemplo de operação de persistência ... public Order createNewOrder(Customer customer) { Order order = new Order(customer); entityManager.persist(order); return order; } ...

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

24

Exemplo de operações de pesquisa e remoção ... public void removeOrder(Long orderId) { Order order = entityManager.find(Order.class, orderId); entityManager.remove(order); } ...

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

25

Exemplo de operação de alteração (merge) ... public OrderLine updateOrderLine(OrderLine orderLine) { return entityManager.merge(orderLine); } ...

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

Detached Entities

27

Detached Entities • Entidades não associadas a um contexto de persistência • Tem de implementar interface Serializable se o objeto desacoplado tem de ser enviado via rede • Não há mais necessidade do padrão de desenho DTO (Data Transfer Object)

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

Mapeamento Objeto/Relacional

29

Mapeamento O/R • Especificado usando anotações no código ou em um arquivo separado • Conjunto de anotações, de fácil entendimento, para definir: > > > >

Relacionamentos Junções (Joins) Tabelas e colunas de banco de dados Geradores de seqüências de banco de dados (sequence, autoincrement)

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

30

Mapeamentos simples CUSTOMER ID

@Entity public class Customer { @Id int id; String name; int c_rating; @Lob Image photo; }

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

NAME

C_RATING

PHOTO

31

Mapeamentos simples CUSTOMER ID

@Entity public class Customer { @Id int id; String name; @Column(name=“CREDIT”) int c_rating; @Lob Image photo; }

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

NAME

CREDIT

PHOTO

32

Exemplos de mapeamentos O/R @Entity @Table(name=“TB_EMPLOYEE") public class EMPLOYEE { ... @Column(name=“TX_NAME", nullable=false, length=30) public String getName() { return name; } }

Controle portável de concorrência @Version @Column("OPTLOCK") protected int getVersionNum() { return versionNum; } @ManyToOne @JoinColumn(name="ADDR_ID") public Address getAddress() { return address; }

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

Listeners de Entidades

34

Listeners de entidades • Listeners recebem chamadas do provedor de persistência • Métodos Callback > Na própria classe de entidade ou em uma classe listener

separada > Anotações

> PrePersist / PostPersist > PreRemove/ PostRemove > PreUpdate / PostUpdate > PostLoad

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

35

Listeners de entidades: Exemplo – 1 @Entity @EntityListener(com.acme.AlertMonitor.class) public class AccountBean implements Account { Long accountId; Integer balance; boolean preferred; public Long getAccountId() { ... } public Integer getBalance() { ... } …

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

36

Listeners de entidades : Exemplo – 2 … @PrePersist public void validateCreate() { if (getBalance() < MIN_REQUIRED_BALANCE) throw new AccountException("Insufficient balance to open an account"); } @PostLoad public void adjustPreferredStatus() { preferred =(getBalance() >= AccountManager.getPreferredStatusLevel()); } … MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

37

Listeners de entidades : Exemplo – 3 public class AlertMonitor { @PostPersist public void newAccountAlert(Account acct) { Alerts.sendMarketingInfo(acct.getAccountId(), acct.getBalance()); } }

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

Relacionamentos entre entidades

39

Relacionamentos entre entidades • Associações entre entidades • Cardinalidades > > > >

@OneToOne @OneToMany @ManyToOne @ManyToMany

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

40

Comportamento em cascata • Usado para propagar o efeito de uma operação à entidades associadas • Operações em cascata executam somente quando as entidades estão associadas ao contexto de persistência > Se uma operação em cascata é aplicada a uma entidade

detached, uma IllegalArgumentException é disparada

• • • • •

Cascade=PERSIST Cascade=REMOVE Cascade=MERGE Cascade=REFRESH Cascade=ALL

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

41

Relacionamento: Exemplo @Entity public class Project { private Collection<Employee> employees; @ManyToMany(cascade={CascadeType.ALL}) @JoinTable(name=“PROJ_EMP”) public Collection<Employee> getEmployees() { return employees; }

... }

public void setEmployees(Collection<Employee> employees) { this.employees = employees; }

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

Herança de entidade

43

Herança de entidade • Estratégias de herança suportadas > Single Table > Todas as classes na hierarquia são mapeadas para uma tabela única > Um valor em um campo identifica a subclasse específica > Table per class > Cada classe na hierarquia é mapeada para uma tabela separada > Todas as propriedades das classes são mapeadas para colunas desta tabela incluindo as propriedades herdadas > Joined subclass > A raiz da hierarquia é representada por uma tabela e > Cada subclasse é representada por uma tabela separada que contém campos específicos para a subclasse e também as colunas que representam as suas chaves primárias MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

44

Exemplo de herança de entidade @Entity @Table(name=”CUST”) @Inheritance(strategy=SINGLE_TABLE) @DiscriminatorColumn(name=“CUST_TYPE", discriminatorType=STRING) @DiscriminatorValue(“CUST") public class Customer {...} @Entity @Inheritance(discriminatorValue=”VCUST”) public class ValuedCustomer extends Customer{...}

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

Consultas

46

Avanços do EJB QL • Group By / Having • Subqueries • Funções SQL adicionais > UPPER, LOWER, TRIM, CURRENT_DATE, ...

• Joins • Consultas polimórficas • Suporte para pesquisas dinâmicas e também pesquisas nomeadas

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

47

Dynamic Queries public List findWithName (String name) { return em.CreateQuery ( “SELECT c FROM Customer c” + “WHERE c.name LIKE :custName”) .setParameter(“custName”, name) .setMaxResults(10) .getResultList(); }

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

48

Named Queries @NamedQuery( name=“findCustomersByName”, queryString=“SELECT c FROM Customer c” + “WHERE c.name LIKE :custName” ) @PersistenceContext public EntityManager em; List customers = em.createNamedQuery(“findCustomersByName”).setParameter(“cust Name”, “smith”).getResultList();

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

49

Resumo • • • • •

JPA é um dos maiores avanços do EJB 3.0 JPA faz uso pesado de anotações JPA suporta persistência baseado em POJO JPA suporta ambos ambientes Java SE e Java EE JPA possui capacidades extensivas para criação de consultas • JPA define um modelo de persistência simplificado

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

Eclipse Web Tools Platform Project 2.0 http://wiki.eclipse.org/index.php/Web_Tools_Project http://wiki.eclipse.org/index.php/JEE_5_Support

51

WTP 2.0 • Próximo release do Eclipse Web Tools Project • Previsão de lançamento no Eclipse Europa 2007, Junho 2007 • Realinhamento para suporte completo ao JEE 5 > Java EE 5 focado em facilitar desenvolvimento > JEE5 inclui todas as features do JEE 1.4 e melhorias

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

52

WTP 2.0 • Suporte a JEE 5 inclui melhorias em: > Web Services > Web Applications > Enterprise Applications > Management (Relativo a servidores)

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

53

WTP 2.0 – Suporte ao JEE 5.0 • Web Services API Baseada no JSR 109 • Axis2 integrado no WTP com as seguintes features: > JSR-224 JAX-WS 2.0 JAXB 2 SAAJ 1.3 > JAX-RPC 1.1 > JSR 181 Web Services Metadata > Classes Java anotadas para definição de Web Services

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

54

WTP 2.0 – Suporte ao JEE 5.0 • Web Applications > Servlet 2.5 (JSR 154) > JSP 2.1 (JSR 245) > JSTL (JSR 52) > JSF 1.2

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

55

WTP 2.0 – Suporte ao JEE 5.0 • Enterprise Applications > EJB3 > JPA (JSR 220) > JCA 1.5 (JSR 112)

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

56

WTP 2.0 – Suporte ao JEE 5.0 • Management (Relativo a servidores) > J2EE Application Deployment (JSR 88) > J2EE Management (JSR 77) > Gerenciamento de aplicações Web/Enterprise em servidores JEE 5

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

57

WTP 2.0 • Web Tools 2.0 será baseado no Eclipse 3.3 • O Eclipse WTP é formado por quatro subprojetos. > > > > >

Web Standard Tools (WST) J2EE Standard Tools (JST) JPA (Dali, incubado) Java Server Faces Tools (incubado) AJAX Tools Framework (incubado)

• O Dali, JSF e ATF sairão da incubadora e se tornarão componentes normais no WTP 2.0.

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

Demo Uma aplicação de exemplo utilizando JPA com plugin Dali

59

(Salvador Dalí) The Persistence of Memory, 1931

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

60

(Salvador Dalí) The desintegration of the persistence of memory

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

61

Demo Dali • Foco no uso do Dali para mapear classes para um banco relacional – detalhes da parte Web não serão discutidos.

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

62

Demo Dali • Criar banco de dados

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

63

Demo Dali • Criar conexão

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

64

Demo Dali • Criar projeto Java (Java Project) > > > > > > > >

Adicionar persistência Java Criar entidades Java persistentes Associar as classes de entidade com as tabelas (Entity) Criar mapeamentos básicos (Basic) Criar mapeamentos um-para-um (one-to-one) Criar mapeamentos de versão (version) Adicionar as consultas (queries) Gerenciar o arquivo persistence.xml

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

65

Demo Dali • Criar teste unitário (JUnit 4.0) > Criar TestCase > Executar TestCase

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

66

Demo Dali • Criar projeto Web (Dynamic Web Project) • Adicionar recursos > Associar o projeto do modelo > Adicionar arquivos do projeto

• Publicar aplicação

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

67

JPA – Java Persistence API Persistência para aplicações Java SE e Java EE

Adriano de Pinho Tavares Consultor / Arquiteto de Sistemas [email protected]

MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007

Related Documents