Sei sulla pagina 1di 67

JPA – Java Persistence API

Persistência para aplicações Java SE e Java EE

Adriano de Pinho Tavares


Consultor / Arquiteto de Sistemas
adriano@mgjug.com.br
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<Pedido> pedidos = new HashSet();

// construtor sem argumentos


public Cliente() {}

public Long getId() {


return id;
}

protected void setId (Long id) { Getters/setters para


this.id = id; acessar o estado interno
}
...
MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007
17

Exemplo inicial em Java EE (cont.)


...
Define relacionamento 1:n
com tabela Pedido
@OneToMany
public Collection<Pedido> getPedidos() {
return pedidos;
}

public void setPedidos(Collection<Pedido> 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 NAME C_RATING PHOTO

@Entity
public class Customer {
@Id
int id;

String name;

int c_rating;

@Lob
Image photo;
}

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


31

Mapeamentos simples

CUSTOMER
ID NAME CREDIT PHOTO

@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


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
adriano@mgjug.com.br

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

Potrebbero piacerti anche