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