JPA - MGJUG
Upcoming SlideShare
Loading in...5
×
 

JPA - MGJUG

on

  • 4,373 views

 

Statistics

Views

Total Views
4,373
Views on SlideShare
4,285
Embed Views
88

Actions

Likes
1
Downloads
199
Comments
0

3 Embeds 88

http://adrianotavares.com 65
http://www.slideshare.net 21
http://www.linkedin.com 2

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

JPA - MGJUG JPA - MGJUG Presentation Transcript

  • 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; } 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 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 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 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 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
  • 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(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 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_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
  • 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