67
JPA – Java Persistence API Persistência para aplicações Java SE e Java EE Adriano de Pinho Tavares Adriano de Pinho Tavares Consultor / Arquiteto de Sistemas Consultor / Arquiteto de Sistemas [email protected]

JPA - MGJUG

Embed Size (px)

Citation preview

Page 1: JPA - MGJUG

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

Adriano de Pinho TavaresAdriano de Pinho TavaresConsultor / Arquiteto de SistemasConsultor / Arquiteto de Sistemas

[email protected]

Page 2: JPA - MGJUG

2

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

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

Page 3: JPA - MGJUG

3

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

Agenda Geral

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

Page 4: JPA - MGJUG

Conceitos de Conceitos de mapeamento mapeamento objeto/relacional (ORM)objeto/relacional (ORM)

Page 5: JPA - MGJUG

5

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

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

Page 6: JPA - MGJUG

6

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

O que é mapeamento Objeto/Relacional (ORM)?

• Cada instância de objeto corresponde a um registro no banco de dados

Page 7: JPA - MGJUG

7

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

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

Page 8: JPA - MGJUG

JPA Requisitos JPA Requisitos de persistênciade persistência

Page 9: JPA - MGJUG

9

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

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

Page 10: JPA - MGJUG

10

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

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

Page 11: JPA - MGJUG

JPA Modelo de JPA Modelo de programaçãoprogramação

Page 12: JPA - MGJUG

12

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

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

Page 13: JPA - MGJUG

13

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

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

Page 14: JPA - MGJUG

14

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

Chave primária

• Chave primária pode ser simples ou composta • Chave primária pode ser mapeada para campo ou

propriedade

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

composta

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

Page 15: JPA - MGJUG

15

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

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}

Page 16: JPA - MGJUG

16

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

Exemplo inicial em Java EE

@Entity public class Cliente {

@Id private Long id; private String nome; private Endereco endereco; private Collection<Pedido> pedidos = new HashSet();

// construtor sem argumentos public Cliente() {}

public Long getId() { return id; } protected void setId (Long id) { this.id = id; }...

Getters/setters para acessar o estado interno

@Id define chave primária

Page 17: JPA - MGJUG

17

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

Exemplo inicial em Java EE (cont.)

...

@OneToManypublic Collection<Pedido> getPedidos() { return pedidos;}

public void setPedidos(Collection<Pedido> pedidos) { this.pedidos = pedidos;}

// Outros métodos de negócio...

}

Define relacionamento 1:n com tabela Pedido

Page 18: JPA - MGJUG

18

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

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}

Page 19: JPA - MGJUG

Ciclo de vida de Ciclo de vida de entidadeentidade

Page 20: JPA - MGJUG

20

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

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

Page 21: JPA - MGJUG

21

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

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

Page 22: JPA - MGJUG

22

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

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

Page 23: JPA - MGJUG

23

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

Exemplo de operação de persistência

...

public Order createNewOrder(Customer customer) {Order order = new Order(customer);entityManager.persist(order);return order;

}

...

Page 24: JPA - MGJUG

24

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

Exemplo de operações de pesquisa e remoção

...

public void removeOrder(Long orderId) {Order order = entityManager.find(Order.class, orderId);entityManager.remove(order);

}

...

Page 25: JPA - MGJUG

25

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

Exemplo de operação de alteração (merge)

...

public OrderLine updateOrderLine(OrderLine orderLine) {return entityManager.merge(orderLine);

}

...

Page 26: JPA - MGJUG

Detached Entities

Page 27: JPA - MGJUG

27

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

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)

Page 28: JPA - MGJUG

Mapeamento Mapeamento Objeto/RelacionalObjeto/Relacional

Page 29: JPA - MGJUG

29

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

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)

Page 30: JPA - MGJUG

30

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

Mapeamentos simples

CUSTOMERID NAME C_RATING PHOTO

@Entity

@Id

@Lob

public class Customer { int id; String name; int c_rating;

Image photo;}

Page 31: JPA - MGJUG

31

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

public class Customer {

int id; String name; int c_rating; Image photo;}

Mapeamentos simples

@Entity

@Column(name=“CREDIT”)

@Id

@Lob

CUSTOMERID NAME CREDIT PHOTO

Page 32: JPA - MGJUG

32

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

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; }

}

@Version@Column("OPTLOCK")protected int getVersionNum() { return versionNum; }

@ManyToOne@JoinColumn(name="ADDR_ID")public Address getAddress() { return address; }

Controle portável de concorrência

Page 33: JPA - MGJUG

Listeners de EntidadesListeners de Entidades

Page 34: JPA - MGJUG

34

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

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

Page 35: JPA - MGJUG

35

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

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() { ... }

Page 36: JPA - MGJUG

36

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

Listeners de entidades : Exemplo – 2

@PrePersistpublic void validateCreate() {

if (getBalance() < MIN_REQUIRED_BALANCE)throw new AccountException("Insufficient balance to

open an account");}

@PostLoadpublic void adjustPreferredStatus() {

preferred =(getBalance() >= AccountManager.getPreferredStatusLevel());

} …

Page 37: JPA - MGJUG

37

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

Listeners de entidades : Exemplo – 3

public class AlertMonitor {

@PostPersistpublic void newAccountAlert(Account acct) {

Alerts.sendMarketingInfo(acct.getAccountId(), acct.getBalance());

}}

Page 38: JPA - MGJUG

Relacionamentos entre Relacionamentos entre entidadesentidades

Page 39: JPA - MGJUG

39

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

Relacionamentos entre entidades

• Associações entre entidades• Cardinalidades

> @OneToOne> @OneToMany> @ManyToOne> @ManyToMany

Page 40: JPA - MGJUG

40

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

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

Page 41: JPA - MGJUG

41

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

Relacionamento: Exemplo

@Entitypublic 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;

}...}

Page 42: JPA - MGJUG

Herança de entidadeHerança de entidade

Page 43: JPA - MGJUG

43

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

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

Page 44: JPA - MGJUG

44

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

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{...}

Page 45: JPA - MGJUG

ConsultasConsultas

Page 46: JPA - MGJUG

46

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

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

Page 47: JPA - MGJUG

47

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

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();}

Page 48: JPA - MGJUG

48

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

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(“custName”, “smith”).getResultList();

Page 49: JPA - MGJUG

49

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

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

Page 50: JPA - MGJUG

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

Page 51: JPA - MGJUG

51

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

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

Page 52: JPA - MGJUG

52

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

WTP 2.0

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

Page 53: JPA - MGJUG

53

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

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

Page 54: JPA - MGJUG

54

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

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

Page 55: JPA - MGJUG

55

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

WTP 2.0 – Suporte ao JEE 5.0

• Enterprise Applications > EJB3 > JPA (JSR 220) > JCA 1.5 (JSR 112)

Page 56: JPA - MGJUG

56

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

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

Page 57: JPA - MGJUG

57

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

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.

Page 58: JPA - MGJUG

DemoDemoUma aplicação de exemplo utilizando JPA com plugin Dali

Page 59: JPA - MGJUG

59

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

(Salvador Dalí) The Persistence of Memory, 1931

Page 60: JPA - MGJUG

60

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

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

Page 61: JPA - MGJUG

61

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

Demo Dali

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

Page 62: JPA - MGJUG

62

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

Demo Dali

• Criar banco de dados

Page 63: JPA - MGJUG

63

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

Demo Dali

• Criar conexão

Page 64: JPA - MGJUG

64

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

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

Page 65: JPA - MGJUG

65

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

Demo Dali

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

Page 66: JPA - MGJUG

66

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

Demo Dali

• Criar projeto Web (Dynamic Web Project)• Adicionar recursos

> Associar o projeto do modelo> Adicionar arquivos do projeto

• Publicar aplicação

Page 67: JPA - MGJUG

67

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

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

Adriano de Pinho TavaresConsultor / Arquiteto de Sistemas

[email protected]