JPA _ Java Persistence API - MGJUG - AdrianoTavares
-
Upload
alexandrearaujo -
Category
Documents
-
view
1.045 -
download
11
Transcript of JPA _ Java Persistence API - MGJUG - AdrianoTavares
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
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
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
Conceitos de Conceitos de mapeamento mapeamento objeto/relacional (ORM)objeto/relacional (ORM)
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
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
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
JPA Requisitos JPA Requisitos de persistênciade persistência
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
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
JPA Modelo de JPA Modelo de programaçãoprogramação
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
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
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; }
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}
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
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
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}
Ciclo de vida de Ciclo de vida de entidadeentidade
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
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
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
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;
}
...
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);
}
...
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);
}
...
Detached Entities
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)
Mapeamento Mapeamento Objeto/RelacionalObjeto/Relacional
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)
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;}
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
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
Listeners de EntidadesListeners de Entidades
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
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() { ... }
…
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());
} …
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());
}}
Relacionamentos entre Relacionamentos entre entidadesentidades
39
MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007
Relacionamentos entre entidades
• Associações entre entidades• Cardinalidades
> @OneToOne> @OneToMany> @ManyToOne> @ManyToMany
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
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;
}...}
Herança de entidadeHerança de entidade
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
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{...}
ConsultasConsultas
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
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();}
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();
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
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
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
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)
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
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
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)
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
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.
DemoDemoUma aplicação de exemplo utilizando JPA com plugin Dali
59
MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007
(Salvador Dalí) The Persistence of Memory, 1931
60
MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007
(Salvador Dalí) The desintegration of the persistence of memory
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.
62
MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007
Demo Dali
• Criar banco de dados
63
MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007
Demo Dali
• Criar conexão
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
65
MGJUG - Java Persistence API - Adriano Tavares – 15/02/2007
Demo Dali
• Criar teste unitário (JUnit 4.0)> Criar TestCase > Executar TestCase
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
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