O documento apresenta uma introdução à Java Persistence API (JPA) e seus principais conceitos. Em 3 frases: JPA fornece um modelo de programação e mapeamento objeto-relacional para aplicações Java que simplifica a persistência de dados; Entidades são objetos mapeados que representam registros no banco de dados; O EntityManager controla o ciclo de vida das entidades e permite operações como persistência, busca, atualização e remoção.
JPA - Java Persistence API: Persistência para aplicações Java SE e Java EE
1. 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. 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. 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
5. 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. 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. 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
9. 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. 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
12. 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. 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. 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. 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. 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;
}
Getters/setters para
protected void setId (Long id) {
acessar o estado interno
this.id = id;
}
...
MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007
17. 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. 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
20. 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. 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. 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. 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. 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. 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
27. 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
29. 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. 30
Mapeamentos simples
CUSTOMER
PHOTO
ID NAME C_RATING
@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. 31
Mapeamentos simples
CUSTOMER
PHOTO
ID NAME CREDIT
@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. 32
Exemplos de mapeamentos O/R
@Entity
@Table(name=“TB_EMPLOYEEquot;)
public class EMPLOYEE {
...
@Column(name=“TX_NAMEquot;, nullable=false, length=30)
public String getName() { return name; }
}
Controle portável de concorrência
@Version
@Column(quot;OPTLOCKquot;)
protected int getVersionNum() { return versionNum; }
@ManyToOne
@JoinColumn(name=quot;ADDR_IDquot;)
public Address getAddress() { return address; }
MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007
34. 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. 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. 36
Listeners de entidades : Exemplo – 2
…
@PrePersist
public void validateCreate() {
if (getBalance() < MIN_REQUIRED_BALANCE)
throw new AccountException(quot;Insufficient balance to
open an accountquot;);
}
@PostLoad
public void adjustPreferredStatus() {
preferred =(getBalance() >=
AccountManager.getPreferredStatusLevel());
}
…
MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007
37. 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
39. 39
Relacionamentos entre entidades
• Associações entre entidades
• Cardinalidades
@OneToOne
>
@OneToMany
>
@ManyToOne
>
@ManyToMany
>
MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007
40. 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. 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
43. 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. 44
Exemplo de herança de entidade
@Entity
@Table(name=”CUST”)
@Inheritance(strategy=SINGLE_TABLE)
@DiscriminatorColumn(name=“CUST_TYPEquot;,
discriminatorType=STRING)
@DiscriminatorValue(“CUSTquot;)
public class Customer {...}
@Entity
@Inheritance(discriminatorValue=”VCUST”)
public class ValuedCustomer extends Customer{...}
MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007
46. 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. 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. 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. 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
50. 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. 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. 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. 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
56. 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. 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
59. 59
(Salvador Dalí) The Persistence of
Memory, 1931
MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007
60. 60
(Salvador Dalí) The desintegration of
the persistence of memory
MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007
61. 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. 62
Demo Dali
• Criar banco de dados
MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007
63. 63
Demo Dali
• Criar conexão
MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007
64. 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. 65
Demo Dali
• Criar teste unitário (JUnit 4.0)
> Criar TestCase
> Executar TestCase
MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007
66. 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. 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