JPA   Java Persistence API
Quem sou... Rodrigo Cascarrolho – “Casca”( [email_address] ) Programador/Desenvolvedor Java Bacharel em Ciência da Computação pela PUC-SP Site:   www.rdgc.com.br  (???) Hobby:   www.flickr.com/photos/rdgcasca/ Slide   / 20 28/11/2008 -  10:58
Problema x Solução Solução     ORM - Mapeamento Objeto / Relacional CoughPHP   – ORM para PHP.  SQLObject   – ORM para Python  Hibernate – ORM Java, da JBoss TopLink – ORM Java, da Oracle OJB   – ORM Java, da Apache Slide   / 20 28/11/2008 -  10:58 Problema : Programação O.O. X Banco de Dados Relacional Java Tabelas Relacionadas Objetos Mapeamento O/R Interface BDR Tabelas Interface BDR
Sobre Java Persistence: JPA Mapeamento Objeto/Relacional (ORM) Query Language EJB 3.0 - JSR 220 -  http://www.jcp.org/en/jsr/detail ? id=220 Pacote: javax.persistence  Mapeamento por XML ou Annotation Frameworks (Hibernate; TopLink; OpenJPA) Pode ser utilizado fora de containers EJBs (ligthweigth container) Uso de injeção de dependência ao invés de lookups JNDI Slide   / 20 28/11/2008 -  10:58
Aplicação com JPA Slide   / 20 28/11/2008 -  10:58 Aplicação Java JPA Provedor JPA  (Hibernate, TopLink,...) Driver JDBC SGBDR API JDBC
Como acessamos o banco Slide   / 20 28/11/2008 -  10:58 Mbean Facade Gerente DAO JPA ConectorLogos SAD SQL Mapper Mbean Facade Gerente JPA SIGA Praxis Injeção de dependência: JPA Injeção de dependência: JPA Transação Gerenciada JSP EJB 2.1 .java (Control) Executa Query BD SQL DisconnectedResultSet Logos BD BD
JPA – Java Persistence API Entity:  POJO’s, suporta herança e polimorfismo; EntityManager:  responsável pelas operações de persistência de objetos; PersistenceContext:  área de memória que mantém os objetos que estão sendo manipulados pelo EntityManager; Provedores:  especificação para frameworks de persistência. Slide   / 20 28/11/2008 -  10:58
Mapeamento Pode ser feito por metadados (xml) ou anotações (java5). Usando anotações: @ Entity: entidade a ser persistida; @ Table: especifica propriedades da tabela; @ Column: especifica propriedades da coluna; @ Id: chave primária; @ NamedQuery: cria consultas estáticas; @ GeneratedValue: gera id`s automaticamente; @ Temporal: informações de tempo (Date, Time, etc); @ OneToMany: relacionamento “um-para-muitos”; @ ManyToOne: relacionamento “muitos-para-um”; @ Version: controle de versão do objeto. Slide   / 20 28/11/2008 -  10:58
Exemplo – entidade ‘Carro’ Slide   / 20 28/11/2008 -  10:58
Exemplo – entidade “Item” Slide   / 20 28/11/2008 -  10:58
Persistence.xml META-INF/persistence.xml Slide   / 20 28/11/2008 -  10:58
Relacionamentos Tipos: @MappedSuperClass @Embedded @Embeddable @ManyToMany @ManyToOne @OneToMany @OneToOne @JoinTable @JoinColumns @JoinColumn @MapKey Slide   / 20 28/11/2008 -  10:59 Entity: Carro Entity: Item
Configurações Configurações Cascade ALL Merge Persist Refresh Remove Fetch EAGER LAZY Slide   / 20 28/11/2008 -  10:59 Cuidado, seu objeto pode ficar gordo! Atenção, se a transação não estiver gerenciada, será necessário carregar os objetos “na mão”. Atenção!
Eager e Lazy Slide   / 20 28/11/2008 -  10:59 Lazy Eager Lista não carregada ‘ Get’ não foi solicitado Lista carregada ‘ Get’ não foi solicitado Fetch = FetchType.EAGER; Fetch = FetchType.Lazy;
Manipulando Entity’s sem EJB Entity: Carro  carro ; EntityManagerFactory   emf  =  Persistence. createEntityManagerFactory ("apresentacaoJPA"); EntityManager   em  =  emf .createEntityManager(); EntityTransaction  et  =  em .getTransaction(); et .begin(); Insert:  em .persist( carro ); Update:  em .merge( carro ); Remove:  em .remove( carro ); Busca:  em .find(Carro.class, id); et .commit(); ou  et .rollback(); Slide   / 20 28/11/2008 -  10:59
Manipulando Entity’s com EJB Entity: Carro  carro ; EntityManagerFactory   emf  =  Persistence. createEntityManagerFactory ("apresentacaoJPA"); @PersistenceContext EntityManager   em   =  emf.createEntityManager(); EntityTransaction et = em.getTransaction(); et.begin(); Insert:  em .persist( carro ); Update:  em .merge( carro ); Remove:  em .remove( carro ); Busca:  em .find(Carro.class, id); et.commit(); ou et.rollback(); Injetado pelo conteiner EJB. Slide   / 20
JPQL Java Persistence Query Language @ NamedQueries ({ @ NamedQuery ( name = &quot;Carro.getAll&quot;, query = &quot;select c from Carro c&quot; ), @ NamedQuery ( name = &quot;Carro.getCarro&quot;, query = &quot;select c from Carro c where c.id = :idCarro&quot; ) }) EntityManager  em  = getEntityManager(); Query  query  =  em .createNamedQuery(“ Carro .getCarro&quot;); query .setParameter(“idCarro&quot;, id); return  ( Carro )  query . getSingleResult() ; return   query . getResultList( ) ; Podemos usar também: Group By, Having, Order By, Between, IN, Like, IS NULL, IS EMPTY, AND, >, <, JOIN Slide   / 20 28/11/2008 -  10:59
Demonstração ... Slide   / 20
Futuro – JPA 2.0 JPA 2.0 separado do  EJB 3.0; Melhor suporte para classes “embedded”; Suporte a validações (@Length(5), @Max(2) - JSR-303) ; Suporte a coleções de tipos básicos (Set<String>) ; Suporte a listas ordenadas; Mapeamento @OneToMany vai ser obrigatoriamente “inverse” o que realmente faz mais sentido pela semântica do mapeamento; No JPA 1.0 todas as consultas são polimorficas, no JPA 2.0 sera possivel especificar quando isto não é desejado.  Suporte a Criteria. Slide   / 20 28/11/2008 -  10:59
Links Comparação entre persistência com EJB2.1 e EJB3.0  http://java.sun.com/developer/technicalArticles/J2EE/jpa/ Tutorial Sun Persistence  http://java.sun.com/javaee/technologies/persistence . jsp TopLink  http://www.oracle.com/technology/products/ias/toplink/jpa/index.html JPQL   http://java.sun.com/mailers/techtips/enterprise/2006/TechTips_Oct06.html Slide   / 20 28/11/2008 -  10:59
Fim Slide   / 21 28/11/2008 -  10:59 Obrigado!

JPA - Java Persistence API

  • 1.
    JPA Java Persistence API
  • 2.
    Quem sou... RodrigoCascarrolho – “Casca”( [email_address] ) Programador/Desenvolvedor Java Bacharel em Ciência da Computação pela PUC-SP Site: www.rdgc.com.br (???) Hobby: www.flickr.com/photos/rdgcasca/ Slide / 20 28/11/2008 - 10:58
  • 3.
    Problema x SoluçãoSolução  ORM - Mapeamento Objeto / Relacional CoughPHP – ORM para PHP. SQLObject – ORM para Python Hibernate – ORM Java, da JBoss TopLink – ORM Java, da Oracle OJB – ORM Java, da Apache Slide / 20 28/11/2008 - 10:58 Problema : Programação O.O. X Banco de Dados Relacional Java Tabelas Relacionadas Objetos Mapeamento O/R Interface BDR Tabelas Interface BDR
  • 4.
    Sobre Java Persistence:JPA Mapeamento Objeto/Relacional (ORM) Query Language EJB 3.0 - JSR 220 - http://www.jcp.org/en/jsr/detail ? id=220 Pacote: javax.persistence Mapeamento por XML ou Annotation Frameworks (Hibernate; TopLink; OpenJPA) Pode ser utilizado fora de containers EJBs (ligthweigth container) Uso de injeção de dependência ao invés de lookups JNDI Slide / 20 28/11/2008 - 10:58
  • 5.
    Aplicação com JPASlide / 20 28/11/2008 - 10:58 Aplicação Java JPA Provedor JPA (Hibernate, TopLink,...) Driver JDBC SGBDR API JDBC
  • 6.
    Como acessamos obanco Slide / 20 28/11/2008 - 10:58 Mbean Facade Gerente DAO JPA ConectorLogos SAD SQL Mapper Mbean Facade Gerente JPA SIGA Praxis Injeção de dependência: JPA Injeção de dependência: JPA Transação Gerenciada JSP EJB 2.1 .java (Control) Executa Query BD SQL DisconnectedResultSet Logos BD BD
  • 7.
    JPA – JavaPersistence API Entity: POJO’s, suporta herança e polimorfismo; EntityManager: responsável pelas operações de persistência de objetos; PersistenceContext: área de memória que mantém os objetos que estão sendo manipulados pelo EntityManager; Provedores: especificação para frameworks de persistência. Slide / 20 28/11/2008 - 10:58
  • 8.
    Mapeamento Pode serfeito por metadados (xml) ou anotações (java5). Usando anotações: @ Entity: entidade a ser persistida; @ Table: especifica propriedades da tabela; @ Column: especifica propriedades da coluna; @ Id: chave primária; @ NamedQuery: cria consultas estáticas; @ GeneratedValue: gera id`s automaticamente; @ Temporal: informações de tempo (Date, Time, etc); @ OneToMany: relacionamento “um-para-muitos”; @ ManyToOne: relacionamento “muitos-para-um”; @ Version: controle de versão do objeto. Slide / 20 28/11/2008 - 10:58
  • 9.
    Exemplo – entidade‘Carro’ Slide / 20 28/11/2008 - 10:58
  • 10.
    Exemplo – entidade“Item” Slide / 20 28/11/2008 - 10:58
  • 11.
  • 12.
    Relacionamentos Tipos: @MappedSuperClass@Embedded @Embeddable @ManyToMany @ManyToOne @OneToMany @OneToOne @JoinTable @JoinColumns @JoinColumn @MapKey Slide / 20 28/11/2008 - 10:59 Entity: Carro Entity: Item
  • 13.
    Configurações Configurações CascadeALL Merge Persist Refresh Remove Fetch EAGER LAZY Slide / 20 28/11/2008 - 10:59 Cuidado, seu objeto pode ficar gordo! Atenção, se a transação não estiver gerenciada, será necessário carregar os objetos “na mão”. Atenção!
  • 14.
    Eager e LazySlide / 20 28/11/2008 - 10:59 Lazy Eager Lista não carregada ‘ Get’ não foi solicitado Lista carregada ‘ Get’ não foi solicitado Fetch = FetchType.EAGER; Fetch = FetchType.Lazy;
  • 15.
    Manipulando Entity’s semEJB Entity: Carro carro ; EntityManagerFactory emf = Persistence. createEntityManagerFactory (&quot;apresentacaoJPA&quot;); EntityManager em = emf .createEntityManager(); EntityTransaction et = em .getTransaction(); et .begin(); Insert: em .persist( carro ); Update: em .merge( carro ); Remove: em .remove( carro ); Busca: em .find(Carro.class, id); et .commit(); ou et .rollback(); Slide / 20 28/11/2008 - 10:59
  • 16.
    Manipulando Entity’s comEJB Entity: Carro carro ; EntityManagerFactory emf = Persistence. createEntityManagerFactory (&quot;apresentacaoJPA&quot;); @PersistenceContext EntityManager em = emf.createEntityManager(); EntityTransaction et = em.getTransaction(); et.begin(); Insert: em .persist( carro ); Update: em .merge( carro ); Remove: em .remove( carro ); Busca: em .find(Carro.class, id); et.commit(); ou et.rollback(); Injetado pelo conteiner EJB. Slide / 20
  • 17.
    JPQL Java PersistenceQuery Language @ NamedQueries ({ @ NamedQuery ( name = &quot;Carro.getAll&quot;, query = &quot;select c from Carro c&quot; ), @ NamedQuery ( name = &quot;Carro.getCarro&quot;, query = &quot;select c from Carro c where c.id = :idCarro&quot; ) }) EntityManager em = getEntityManager(); Query query = em .createNamedQuery(“ Carro .getCarro&quot;); query .setParameter(“idCarro&quot;, id); return ( Carro ) query . getSingleResult() ; return query . getResultList( ) ; Podemos usar também: Group By, Having, Order By, Between, IN, Like, IS NULL, IS EMPTY, AND, >, <, JOIN Slide / 20 28/11/2008 - 10:59
  • 18.
  • 19.
    Futuro – JPA2.0 JPA 2.0 separado do  EJB 3.0; Melhor suporte para classes “embedded”; Suporte a validações (@Length(5), @Max(2) - JSR-303) ; Suporte a coleções de tipos básicos (Set<String>) ; Suporte a listas ordenadas; Mapeamento @OneToMany vai ser obrigatoriamente “inverse” o que realmente faz mais sentido pela semântica do mapeamento; No JPA 1.0 todas as consultas são polimorficas, no JPA 2.0 sera possivel especificar quando isto não é desejado. Suporte a Criteria. Slide / 20 28/11/2008 - 10:59
  • 20.
    Links Comparação entrepersistência com EJB2.1 e EJB3.0 http://java.sun.com/developer/technicalArticles/J2EE/jpa/ Tutorial Sun Persistence http://java.sun.com/javaee/technologies/persistence . jsp TopLink http://www.oracle.com/technology/products/ias/toplink/jpa/index.html JPQL http://java.sun.com/mailers/techtips/enterprise/2006/TechTips_Oct06.html Slide / 20 28/11/2008 - 10:59
  • 21.
    Fim Slide / 21 28/11/2008 - 10:59 Obrigado!