SlideShare uma empresa Scribd logo
[ Java Persintence API ]

            Simplificando a Persistência de Objetos

                                             Autor: Eduardo R. Carvalho
                                             email: ercarval@gmail.com
7/10/2008             Java Persistence API
Agenda

    ● Requerimentos para o JPA
    ● Modelo de Codificação do JPA
    ● Ciclo de Vida do Entity & Entity Manager
    ● Detached Entities
    ● Relacionamento entre os Entity
    ● Mapeamento Objeto Relacional
    ● Entity Listeners
    ● Query
    ● Transações
    ● Objetos Embutidos
    ● Chaves Primárias Compostas

7/10/2008              Java Persistence API
Agenda

    ● JPA Overview
    ● Entities
    ● Packaging
    ● EntityManager
    ● Java EE no Mundo Java SE
    ● JPQL




7/10/2008          Java Persistence API
Requisitos do JPA
   ● Simplificação do Modelo de Persistência
            ○ Eliminação da Necessidade de Descritores para
              Deploy
   ● Modelo de Persistência Leve
            ○ Padronizando os Frameworks de O/R
   ● Testavel fora do Container
            ○ Possibilidade da Criação de Testes utilizando os
              Entities sem a necessidade de um Container
   ● Possibilidade de Utilização de Herança e
     Polimorfismo
   ● Mapeamento Objeto Relacional
   ● Extensa Capacidade de Quering
7/10/2008                       Java Persistence API
JPA Comum em JSE e JEE

    ● A API de persistência foi expandida
      para que também fosse utilizada sem a
      necessidade de um Container EJB
            ○ Ela pode ser utilizada em Ambientes JSE,
              Web e em Aplicações EJB.
    ● Suporte a implementações de
      Fornecedores
            ○ Através do persistence.xml



7/10/2008                   Java Persistence API
Agenda

    ● JPA Overview
    ● Entities
    ● Packaging
    ● EntityManager
    ● Java EE no Mundo Java SE
    ● JPQL




7/10/2008          Java Persistence API
Entity - Característica
     ● Entity nada mais é do que uma Classe Java que representa um
       Entidade de Negócio, também conhecido como um POJO (Plain
       Old Java Object)
     ● Todo entity possui um id.
     ● Não há necessidade de implementação de interfaces
     ● Suporte total a Herança e Polimorfismo
     ● Serializavel, não havendo a necessidade da criação de DTOs,
       para Uso de Clientes Remotos ou transferencia entre camadas.
     ● Suporte a estados não persistentes e persistentes
            ○ Tipos Simples (primitivos, Wrappers, enums)
            ○ Objetos Compostos, Composições e Agregações (Ex. Address)
            ○ Objetos não persistentes, sem estado de persistência (transient)
     ● Utilização de Anotações do JSE5



7/10/2008                            Java Persistence API
POJO x Entity
  POJO
     1.   public class BankAccount {
     2.   private Long id;
     3.   private String accountName;
     4.   private BigDecimal balance;
     5.   }


  Entity Simples ( “ Um POJO promovido ” )

    6.    @Entity
    7.    public class BankAccount {
    8.    @Id
    9.    private Long id;
   10.    private String accountName;
   11.    private BigDecimal balance;
   12.    }


  A Classe é mapeada a Tabela e os atributos são mapeados as colunas

7/10/2008                           Java Persistence API
@Table



    1. @Entity
    2. @Table(name="BANK_ACCOUNT")
    3. public class BankAccount {
    4. @Id
    5. private Long id;
    6. private String accountName;
    7. private BigDecimal balance;
    8. }




7/10/2008                  Java Persistence API
@Version



     1. @Entity
     2. @Table(name="BANK_ACCOUNT")
     3. public class BankAccount {
     4. @Id
     5. private Long id;
     6. @Version
     7. private Long version;
     8. private String accountName;
     9. private BigDecimal balance;
   10. }


  Utilização de Lock Otimista através da Anotação Version



7/10/2008                        Java Persistence API
@Column


    1. @Entity
    2. @Table(name="BANK_ACCOUNT")
    3. public class BankAccount {
    4. @Id
    5. private Long id;
    6. @Version
    7. private Long version;
    8. @Column(name="ACCOUNT_NAME")
    9. private String accountName;
   10. private BigDecimal balance;
   11. }


    ● A Annotation Column permite que você
      defina o nome da coluna , tamanho ,
      precisão, escala, etc.
7/10/2008                     Java Persistence API
@Lob

    1. @Entity
    2. @Table(name="BANK_ACCOUNT")
    3. publicclass BankAccount {
    4. @Id
    5. private Long id;
    6. @Version
    7. private Long version;
    8. @Column(name="ACCOUNT_NAME")
    9. private String accountName;
   10. private BigDecimal balance;
   11. @Lob
   12. private String description;
   13. }


     ● A Configuração de Tamanho de um Atributo/Propriedade
       String padrão é de 255.


7/10/2008                  Java Persistence API
@Enumerated
     1. @Entity
     2. @Table(name="BANK_ACCOUNT")
     3. public class BankAccount {
     4. @Id
     5. private Long id;
     6. // ...
     7. @Enumerated(EnumType.ORDINAL)
     8. private AccountStatus status;
     9. }

   10. public enum AccountStatus {
   11. PENDING, APPROVED, ACTIVE;
   12. }



  A Annotation Enumerated Define dois tipos de
  Enumeration, EnumType : public enum
  EnumType {ORDINAL, STRING}
7/10/2008                      Java Persistence API
@Temporal


   1. @Entity
   2. @Table(name="BANK_ACCOUNT")
   3. public class BankAccount {
   4. @Id
   5. //...
   6. @Enumerated(EnumType.ORDINAL)
   7. private AccountStatus status;
   8. @Temporal(TemporalType.TIMESTAMP)
   9. private Date dateCreated;
  10. }


     ● A Annotation TemporalType Define alguns tipos
       Temporais através da enum : public enum
       TemporalType {DATE, TIME, TIMESTAMP}
7/10/2008                 Java Persistence API
@Transient


    1. @Entity
    2. @Table(name="BANK_ACCOUNT")
    3. public class BankAccount {
    4. @Id
    5. //...
    6. @Enumerated(EnumType.ORDINAL)
    7. private AccountStatus status;
    8. @Temporal(TemporalType.TIMESTAMP)
    9. private Date dateCreated;
   10. @Transient
   11. private BigDecimal calculatedValue;
   12. }


     ● Assim com em classes Serializadas a Annotation
       Transient indica que o atributo não será persistido.

7/10/2008                    Java Persistence API
Modificador transient
    1. @Entity
    2. @Table(name="BANK_ACCOUNT")
    3. publicclass BankAccount {
    4. @Id
    5. //...
    6. @Enumerated(EnumType.ORDINAL)
    7. private AccountStatus status;
    8. @Temporal(TemporalType.TIMESTAMP)
    9. private Date dateCreated;
   10. private transient BigDecimal calculatedValue;
   11. }


     ● O Modificador transiente tem a mesma finalidade para os
       Entities, informar que a o atributo não será Serializado




7/10/2008                    Java Persistence API
Entity Identification

    ● A Especificação do JPA exige que todos
      os Entities informem um Id. Este pode
      ser um Atributo simples, um tipo
      definido pelo usuário. Sendo o primeiro
      um mapeamento para uma coluna no
      banco de dados representando uma
      chave primaria. O Segundo uma
      determinação de chave composta, ou
      seja múltiplas colunas no banco de
      dados.
7/10/2008            Java Persistence API
Persistent ID

    ● @Id – Define a chave primaria a um atributo
      ou propriedade

    ● @EmbeddedId – Mapeia um Entity a um
      Atributo/Propriedade

    ● @IdClass – Mapear multiplos atributos /
      propriedades, para compor uma chave
      primaria composta.

    ● Classes que representam chaves primarias
7/10/2008              Java Persistence API
Chave Primária Simples




    1. @Entity
    2. public class BankAccount {
    3. @Id
    4. private Long id;
    5. // ...
    6. }




7/10/2008               Java Persistence API
Chaves Compostas
  1º. Adicione a Annotation @IdClass              2º. Crie a Classe de que representa
  em BankAccount                                  a Chave (POJO)


     1.   @Entity                                    1.     public class BankAccountKey
     2.   @Table(name="BANK_ACCOUNT")                2.     implements Serializable {
     3.   @IdClass(BankAccountKey.class)             3.     private Long id;
     4.   public class BankAccount {                 4.     private Long secondId;
     5.   @Id                                        5.     }
     6.   private Long id;
     7.   @Id
     8.   private Long secondId;
     9.   }




7/10/2008                            Java Persistence API
Chaves Compostas
                                      2º. Crie a Classe de que representa
  1º. Adicione a
                                      a Chave (POJO) e Adicione a
  Annotation                          Annotation @Embeddable
  @EmbeddedId em
                                         1.     @Embeddable
  BankAccount                            2.     public class BankAccountKey
                                         3.     implements Serializable {
                                         4.     private Long id;
                                         5.     private Long secondId;
    1. @Entity                           6.     }
    2. @Table(name="
       BANK_ACCOUNT")
    3. public class
       BankAccount {
    4. @EmbeddedId
    5. private BankAccountKey
       id;
    6. }
7/10/2008                Java Persistence API
Geração de Chaves Primárias

    ● Use @GeneratedValue para definir a
      geração da Chave Primaria

    ● Estratégias de Geração Disponíveis

    1. public enum GenerationType {
    2. TABLE, SEQUENCE, IDENTITY, AUTO
    3. };



    ● De preferência ao Tipo AUTO sempre
      que possível, visando a portabilidade.
7/10/2008                  Java Persistence API
Relacionamentos com JPA
     ● Suporte a Composição e Agregação

     ● Relacionamentos do Tipo : one-to-one, one-to-many,
       many-to-one, many-to-many

     ● Relacionamento unidirecionais e bidirecionais

     ● Relacionamentos bidirecionais são administrados
       pela aplicação e não pelo provedor de persistência
       (persistence provider).

     ● Em um relacionamento bidirecional não há um proprietário,
       mas sim um referencia cruzada entre eles.
7/10/2008                     Java Persistence API
Relacionamentos Bidirecionais
                      User     1                               1     Address
                                user               address



     1.   @Entity
     2.   @Table(name="address")
     3.   public class Address {                                        address
     4.   @Id
     5.   private Integer id;                                 id   streetAddress   user_id
     6.   @OneToOne
     7.   private User user;
     8.   private String streetAddress;
     9.   }

   10.    @Entity
   11.    public class User {
   12.    @Id
   13.    private Integer id;
   14.    @OneToOne(cascade=CascadeType.ALL, mappedBy="user")
   15.    private Address address;
   16.    }


7/10/2008                              Java Persistence API
Gerenciamento de Relacionamentos

               User   1                              1   Address
                       user               address




   1. @Entity
   2. public class User {
   3. @Id
   4. private Integer id;
   5. @OneToOne(cascade=CascadeType.ALL,
   6. mappedBy="user")
   7. private Address address;
   8. public void setAddress(Address address) {
   9. this.address = address;
  10. address.setUser (this);
  11. }
  12. }



7/10/2008                     Java Persistence API
Composição
     ● O Relacionamento de Composição define um
       relacionamento forte entre dois objetos, sendo um o
       proprietário do outro e o responsável pelo ciclo de
       vida deste objeto.




     ● Use a Annotation @Embedded e @Embeddable para
       determinar o relacionamento de composição
     ● Deteminar a Separação Logica entre os Entities
     ● Ambos os Entities serão persistidos na mesma tabela
7/10/2008                 Java Persistence API
Composição




                                      @Embeddable
                                      public class UserDetail {
  @Entity
                                      private String firstName;
  @Table(name="user")                 private String lastName;
  public class User {                 }
  @Embedded
  private UserDetail
  userDetail;
  private String username;
  private String password;
  }


7/10/2008                Java Persistence API
Agregação

    ● O Relacionamento de Agregação define
      que existe um relacionamento entre as
      partes. Mas não há um proprietário e
      cada um é responsável pelo seu próprio
      ciclo de vida, pode estar associado a
      outras entidades.
    ● As Annotations @ManyToOne,
      @OneToMany, @ManyToMany e
      @OneToOne definem o uso de
      Agregação entre Entities.
7/10/2008           Java Persistence API
Cascade & FetchType
     ● JPA prove suporte a operações do tipo Cascade,
       através do enum CascadeType


            public enum CascadeType {
            ALL, PERSIST, MERGE, REMOVE, REFRESH
            };

     ● JPA também possui suporte a carregamento tardio
       (Lazy) e eager fetching para relacionamentos


            public enum FetchType { LAZY, EAGER };


7/10/2008                 Java Persistence API
Many-to-One




    ● A Annotation @ManyToOne é utilizada
      relacionamentos de muitos para um.
    ● Deve ser utilizada para representar o
      objeto de referencia
    ● A Annotation @JoinColumn é utilizada
      para chaves estrangeiras
7/10/2008           Java Persistence API
Many-to-One




  @Entity
  public class BankAccount implements Serializable {
  // ...
  @ManyToOne(optional=false, fetch=FetchType.LAZY)
  @JoinColumn(name="created_by_user_id")
  private User createdBy;
  }


  * O Elemento optional indica que a coluna pode ser nula ou não
7/10/2008                    Java Persistence API
One-to-Many




    ● Use a Annotation @OneToMany para
      determinar o um Relacionamento de Um Para
      Muitos, não sendo ela a proprietária pelo
      relacionamento.
    ● A Associação do tipo one-to-many representa
      uma Coleção de Obejtos.
    ● Use @JoinColumn para definir chaves
      estrangeiras
    ● A Annotation @OrderBy é utilizada para
7/10/2008             Java Persistence API
One-to-Many



     1. @Entity
     2. @Table(name="user")
     3. public class User {
     4. @OneToMany(mappedBy="createdBy")
     5. @OrderBy("dateCreated DESC")
     6. private List<BankAccount> accounts;
     7. }


     ● A Tabela BankAccount contém a chave estrangeira
       created_by_user_id
     ● A annotation @OneToMany não possui elementos
       opcionais, pois não é proprietário do dado.
7/10/2008                     Java Persistence API
Many-to-Many

    ● Use a Annotation @ManyToMany em
      ambos os lados do relacionamento para
      representar coleções de dados em
      ambos os lados.
    ● Ambos os lados são proprietarios do
      dado
    ● Use a annotation @JoinTable no lado
      proprietário para determinar a tabela
      de ligação.
    ● Compartilha os mesmos elementos de
      @OneToMany
7/10/2008           Java Persistence API
Many-to-Many




  @Entity
  public class Role {
    @ManyToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
            @JoinTable( name = "user_role",
                  joinColumns = @JoinColumn( name = "user_id",
                                referencedColumnName = "id"),
           inverseJoinColumns = @JoinColumn( name = "role_id",
                                  referencedColumnName = "id")
                      )
    protected Set<User> users = new HashSet<User>();
  }




7/10/2008                      Java Persistence API
One-to-One

            User   1                         1   Address
                   user            address




    ● Utiliza a Annotation @OneToOne em ambos
      os lados do relacionamento
    ● Não Existe um proprietário pelo
      relacionamento, ambos os lados são
      responsáveis por este.
    ● Compartilha os mesmos elementos de
      @ManyToOne
7/10/2008                 Java Persistence API
Herança




7/10/2008    Java Persistence API
Herança

    ● JPA tem total suporte a herança
      através das annotations
      @MappedSuperclass e @Inheritance
    ● Suporte a um modelo híbrido, pois é
      possível mesclar em sua hierarquia de
      classes , Entities e Não-Entities, classes
      concretas e abstratas
    ● Use @MappedSuperclass para
      determinar atributos comuns no
      modelo
    ● Use @Inheritance determinar
7/10/2008             Java Persistence API
@MappedSuperclass




7/10/2008         Java Persistence API
MappedSuperclass




7/10/2008     Java Persistence API
@MappedSuperclass
     1. @MappedSuperclass
     2. public abstract class ModelBase {
     3. @Id
     4. private Integer id;
     5. @Version
     6. private Integer version;
     7. }

    8. @Entity
    9. public class User extends ModelBase {
   10. @Column(name="USER_NAME")
   11. private String username;
   12. }

   13. @Entity
   14. public class BankAccount extends ModelBase {
   15. private String accountName;
   16. }



7/10/2008                     Java Persistence API
@Inheritance




7/10/2008       Java Persistence API
@Inheritance

    ● Os Entities podem conter subclasses
            ○ Classe NON-Entity Concreta ou Abstrata
            ○ Classe Entity Concreta ou Abstrata
    ● A Especificação do JPA suporta Três
      Estratégias de Herança para Entities
            ○ SINGLE_TABLE: Uma Tabela para toda
              Hierarquia
            ○ JOINED : Cada Entity (Concreto ou
              Abstrato) na Hierarquia representa uma
              tabela.
            ○ TABLE_PER_CLASS: (Opcional) Uma
7/10/2008
              Tabela por Classe Concreta.
                            Java Persistence API
SINGLE_TABLE
   1.   @Entity
   2.   @Inheritance(strategy=SINGLE_TABLE)
   3.   @DiscriminatorColumn(name="type",
   4.   discriminatorType=STRING)
   5.   public abstract class Rank {
   6.   ...
   7.   protected String rankName;
   8.   protected String avatar ;
   9.   }

 10.    @Entity
 11.    @DiscriminatorValue("SPECIAL_RANK")
 12.    public class SpecialRank
 13.    extends Rank {
 14.    protected String message;                                            RANK
 15.    }                                 Id     Type          RankName    Avatar   Message   minimumPostCount


 16.    @Entity                             1    POST_CO       firstRank   Junior             5
                                                 UNT                       .jpg
 17.    @DiscriminatorValue("POST_COUNT")
                                            2    SPECIAL       Newbie      New.     New
 18.    public class PostCountRank
                                                 _RANK                     jpg      member
 19.    extends Rank {
 20.    protected
 21.    Integer minumumPostCount;
 22.    }



7/10/2008                               Java Persistence API
JOINED
  1. @Entity
  2. @Inheritance(strategy=JOINED)
  3. public abstract class Rank {
  4. protected String rankName;
  5. protected String avatar;
  6. }

  7. @Entity                                                    RANK
  8. public class SpecialRank                  Id      RankName        Avatar
  9. extends Rank {                            1       firstRank       Junior.jpg

 10. protected String message;                 2       Newbie          New.jpg

 11. }

                                                                                         PostCountRANK
 12. @Entity                         SpecialRANK
                                                                                    Id   minimumPostCount
 13. public class PostCountRank   Id    Message
                                                                                         Newbie
                                        Newbie                                      1
                                  2
 14. extends Rank {
 15. protected Integer minimumPostCount;
 16. }



7/10/2008                       Java Persistence API
TABLE_PER_CLASS
  1.   @Entity
  2.   @Inheritance(strategy=TABLE_PER_CLASS)
  3.   public abstract class Rank {
  4.   @Id @GeneratedValue(
  5.   strategy=GenerationType.TABLE)
  6.   private Long id;
  7.   }
  8.   @Entity
  9.   public class SpecialRank
                                                  SPECIALRANK
 10.   extends Rank {
                                       Id Type    RankName  Avatar                      Message
 11.   protected String message;
 12.   }                               1  POST_CO firstRank Junior
                                                   UNT                       .jpg
                                              2    SPECIAL   Newbie          New.       New
 13.   @Entity                                     _RANK                     jpg        member
 14.   public class PostCountRank
 15.   extends Rank {
 16.   protected                                                              POSTCOUNTRANK
 17.   Integer minimumPostCount;                             Id       Type     RankN      Avatar    minimumPost
                                                                               ame                  Count
 18.   }
                                                             1        POST_    firstR     Junior.   5
                                                                      COUNT    ank        jpg
                                                             2        SPECI    Newbie     New.jpg
                                                                      AL_RA
                                                                      NK


7/10/2008                             Java Persistence API
Agenda

    ● JPA Overview
    ● Entities
    ● Packaging
    ● EntityManager
    ● Java EE no Mundo Java SE
    ● JPQL




7/10/2008          Java Persistence API
Packaging
            O Único XML necessário




7/10/2008           Java Persistence API
Empacote seus Entities
     ● A Especificação de JPA necessita de um único XML de
       configuração, este fica no diretório
            ○ META-INF/persistence.xml
            ○ Define o nome do unidade de persistencia (persistence unit)
            ○ Determina Estratégia de Transação para o EntityManager
            ○ Identifica os Entities que estão contidos na unidade de
              persistencia
            ○ Define as Configurações do provedor de persistencia


     ● Você também pode criar o arquivo de mapeamento
       objeto-relacional
            ○ Ele é muito parecido com o .hbm.xml do Hibernate
            ○ Pode ser alterado, ou sobrescrever as annotations
            ○ Ele é Identificado como persistence.xml


7/10/2008                         Java Persistence API
persistence.xml
 <persistence ...>
 <persistence-unit
 name="djbug" transaction-type="RESOURCE_LOCAL">
 <provider>
 org.hibernate.ejb.HibernatePersistence
 </provider>
 <mapping-file>META-INF/orm-mapping.xml</mapping-file>
 <class>org.ujug.jpa.model.BankAccount</class>
 <properties>
 <property name="hibernate.show_sql" value="false" />
 </properties>
 </persistence-unit>
 </persistence>



    ● transaction-type pode ser configurado como :
            ○ JTA
            ○ RESOURCE_LOCAL
7/10/2008                      Java Persistence API
Terminologia JPA

    ● Persistence Unit (Unidade de
      Persistencia) : Nome Lógico dado a um
      grupo de Entities, definidos usando o
      elemento persistence-unit em
      persistence.xml
            ○ <persistence-unit name="djbug" ... >
    ● Persistence Context – O nome dado a
      uma Coleção de Entities em tempo de
      execução, gerenciados pelo
      EntityManager
7/10/2008                 Java Persistence API
Agenda

    ● JPA Overview
    ● Entities
    ● Packaging
    ● EntityManager
    ● Java EE no Mundo Java SE
    ● JPQL




7/10/2008          Java Persistence API
EntityManager




7/10/2008       Java Persistence API
EntityManager

    ● Principal diferença entre JSE e JEE é a
      utilização do EntityManager
    ● Muito similar a inteface Session do
      Hibernate
    ● Ele que prove a acesso ao Persistence
      Context
    ● Prove Serviços do tipo CRUD persist,
      remove, find, merge, etc.
    ● Prove Interface para Transaction API
    ● Factory para a API de Query.
7/10/2008            Java Persistence API
EM & Persistence Context

    ● São segregados em dois tipos
            ○ Gerenciados pelo Container ( JEE ) através
              da annotation @PersistenceCotext
            ○ Gerenciada pela Aplicação (JSE/JEE)
              através do EntityManagerFactory para
              recuperar a referencia, fica a cargo da
              aplicação a responsabilidade sobre a
              gestão do ciclo de vida do EntityManager
    ● Dois tipos de Contexto de Persistencia
            ○ Transacional
7/10/2008
            ○ Entendido (extended persistence context)
                            Java Persistence API
EM – Gerenciado pelo Container

    ● Escopo de Transação gerenciado pelo
      container através do persistence.xml
            <persistence-unit ... transaction-type="
            JTA">

            @PersistenceContext(type=TRANSACTION)
            protected EntityManager entityManager;



            @PersistenceContext(type=EXTENDED)
            protected EntityManager entityManager;


7/10/2008                 Java Persistence API
EM – Gerenciado pela Aplicação

    ● Pode ser utilizado tanto em ambientes
      JSE quanto em JEE
    ● Necessidade de finalizar o EM.
    ● Fica a cargo da Aplicação determinar a
      utilização de transações
    ● EM é provido pelo
      EntityManagerFactory
    ● Utiliza ExtendedPersistenceContext,
      devido a determinação do ciclo de vida
      do EM delegado a aplicação.
7/10/2008           Java Persistence API
EM – Gerenciado pela Aplicação

    ● No ambiente JEE pode ser utilizado a
      annotation @PersitenceUnit

        @PersistenceUnit
        EntityManagerFactory emf;




    ● No ambiente JSE é necessário a
      utilização da classe Persistence
            EntityManagerFactory emf =
            Persistence.createEntityManagerFactory(“season");


7/10/2008                      Java Persistence API
EM – Gerenciado pela Aplicação
@PersistenceUnit
EntityManagerFactory emf;

public User createUser(String username, String password, String email)
{
User u = null;
EntityManager em = emf.createEntityManager();
try {
u = new User();
u.setUsername(username);
u.setPassword(password);
u.getUserDetail().setEmailAddress(email);
em.getTransaction().begin();
em.persist(u);
em.getTransaction().commit();
} finally {
em.close();
}
return u;
}

 // @PersistenceUnit
7/10/2008              é aplicávelJava Persistence API containers JEE 5
                                    somente a
EM – Gerenciado pela Aplicação

  public User createUser(String username, String password, String email)
  {
  User u = null;
  EntityManagerFactory emf =
  Persistence.createEntityManagerFactory("ujug");
  EntityManager em = emf.createEntityManager();
  try {
  u = new User();
  u.setUsername(username);
  u.setPassword(password);
  u.getUserDetail().setEmailAddress(email);
  em.getTransaction().begin();
  em.persist(u);
  em.getTransaction().commit();
  } finally {
  em.close();
  emf.close();
  }
  return u;
  }
7/10/2008                      Java Persistence API
Métodos de Callback e Listeners

    ● Os métodos de callback são determinados
      nos entities e classes no-entities
            ○ void methodName()
            ○ void methodName (Object entity)
    ● Métodos de callback/listeners são registrados
      de acordo com as annotations abaixo

     ● @PrePersist/@PostPersist
     ● @PreUpdate/@PostUpdate – persistence provider dependent
     ● @PreRemove/@PostRemove
     ● @PostLoad



7/10/2008                     Java Persistence API
Métodos de Callback e Listeners
     1. // Para Registrar um callback basta criar um metodo e
     2. // adicionar uma annotation de ciclo de vida.

    3. @MappedSuperclass
    4. public abstract class ModelBase {
    5. @PrePersist
    6. public void setDates() {
    7. Date now = new Date();
    8. if (dateCreated == null) {
    9. dateCreated = now;
   10. }
   11. dateUpdated = now;
   12. }
   13. }




7/10/2008                     Java Persistence API
Registrando a Classe de Listener
     ● Utilizando um Listener

  @MappedSuperclass
  @EntityListeners({ModelListener.class})
  public abstract class ModelBase {
  // fields and methods removed for readability
  }

     ● Implementando um Listener

  public class ModelListener {
  @PrePersist
  public void setDates(ModelBase modelBase) {
  Date now = new Date();
  if (modelBase.getDateCreated() == null)
  modelBase.setDateCreated(now);
  modelBase.setDateUpdated(now);
  }
  }
7/10/2008                       Java Persistence API
Agenda

    ● JPA Overview
    ● Entities
    ● Packaging
    ● EntityManager
    ● Java EE no Mundo Java SE
    ● JPQL




7/10/2008          Java Persistence API
Java EE no Java SE
            Provido por Spring




7/10/2008         Java Persistence API
Use Spring como Ponte para JEE

    ● Utilizar o suporte JPA provido pelo
      Spring
    ● Spring provê integração com JPA ,
      implementando as responsabilidades do
      Container
    ● Utiliza os Provedores de Persistencia
      (Hibernate,TopLink)
    ● Habilita Annotations
      @PersistenceContext em aplicações JSE
    ● Para mais informações acesse a
      documentação do Spring 2.0
7/10/2008           Java Persistence API
Agenda

    ● JPA Overview
    ● Entities
    ● Packaging
    ● EntityManager
    ● Java EE no Mundo Java SE
    ● JPQL




7/10/2008          Java Persistence API
JPQL
            Aceita SQL ??




7/10/2008      Java Persistence API
JPQL - Visão Geral

    ● Independente de Banco de Dados
    ● Suporte a projeção para classe no-entity
    ● Suporte a funções de agregação ex. max ,
      min, avg, etc.
    ● Suporte a Atualizações em Lote update e
      delete
    ● Suporte a subquery
    ● Suporte a inner e outer joins
    ● Suporte a queries dinâmicas e estáticas
      (named)
    ● Sintaxe JPQL semelhante a SQL
            ■ select from [where] [group by] [having] [order
7/10/2008
              by]            Java Persistence API
Query API

    ● Utiliza o EntityManager para obter a
      instancia do Objeto Query
             Query q = em.createQuery(“query
             string”);
    ● API de Query permite:
            ○ Controle de paginação
            ○ Definir Maximo de resultados retornados
            ○ Utilização de nome da definição de
              parâmetros para as queries ou por posição


7/10/2008                   Java Persistence API
Criando uma Query

      ● EntityManager query related methods:
  public Query createQuery(String qlString);
  public Query createNamedQuery(String name);
  public Query createNativeQuery(String sqlString);
  public Query createNativeQuery(String sqlString, Class resultClass);
  public Query createNativeQuery(String sqlString, String
  resultSetMapping);


  @PersistenceContext
  protected EntityManager entityManager;


  public List findAll() {
  Query q = entityManager.createQuery("select user from User u");
  return q.getResultList();
  }

7/10/2008                      Java Persistence API
Queries Estáticas e Dinâmicas

    ● Queries Estaticas são definidas através
      das Annotation @NamedQuery e
      retornadas através do metodo
            ○ EntityManager.createNamedQuery()

    ● Queries Dinamicas são definidas
      através do metodo
            ○ EntityManager.createQuery()
    ● Tanto as Queries Estaticas quanto
      queries Dinamicas podem utilizar Query
      Pre-Compiladas
7/10/2008                   Java Persistence API
Exemplo de Query Dinamica
    1. Query q = em.createQuery("SELECT u FROM User u " +
    2. “WHERE u.username = ?1");
    3. q.setParameter(1, "mac");
    4. q.setFirstResult(10); // numbered from 0
    5. q.setMaxResults(10); // only fetch 10
    6. List results = q.getResultList();




7/10/2008                  Java Persistence API
Exemplo de Query Estatica
     ● Definindo query:

     ● @Entity
     ● @NamedQuery(name="user.updatedAtIP", query="select u
     ● from User u where u.updatedAtIP like :ip")
     ● public class User extends ModelBase {
     ● // removed for readibility...
     ●}


     ● Utilizando a Query acima:

     ● Query q = em.createNamedQuery("user.updatedAtIP");
     ● q.setParameter("ip", "127.0.0.1");
     ● q.setFirstResult(9); // numbered from 0
     ● q.setMaxResults(10); // only fetch 10
     ● List results = q.getResultList();
7/10/2008                  Java Persistence API
Navegando no Objeto

    ● Suporte a navegação entre os entities
      relacionados na clausula Select,
      utilizando o operador (.) para acessar
      atributos simples, não coleções.
            ○ select p.toUser.userIPAddresses from
              PrivateMessage p
    ● Utilize a palavra Chave join para
      acessar atributos definidos em coleções
            ○ select r.name from User u join u.roles
              r
7/10/2008                  Java Persistence API
Bibliografia

    ● EJB 3.0 In Action
            ○ [ISBN : 1-933988-34-7]
    ● JPA 101: Java Persistence Explained
            ○ [ISBN : 0-9765534-1-4]




7/10/2008                  Java Persistence API

Mais conteúdo relacionado

Destaque

Enterprise JavaBeans simples e descomplicado, na prática
Enterprise JavaBeans simples e descomplicado, na práticaEnterprise JavaBeans simples e descomplicado, na prática
Enterprise JavaBeans simples e descomplicado, na prática
Globalcode
 
Ria e Java FX
Ria e Java FXRia e Java FX
Ria e Java FX
Marcelo Quinta
 
Conhecendo Java
Conhecendo JavaConhecendo Java
Conhecendo Java
Rafael Carneiro
 
Campus Party 2014 - Internet das Coisas com coisas reais
Campus Party 2014 - Internet das Coisas com coisas reaisCampus Party 2014 - Internet das Coisas com coisas reais
Campus Party 2014 - Internet das Coisas com coisas reais
Globalcode
 
JavaFX: Abordagem Prática
JavaFX: Abordagem PráticaJavaFX: Abordagem Prática
JavaFX: Abordagem Prática
Eder Magalhães
 
JavaFx - Guia Prático
JavaFx - Guia PráticoJavaFx - Guia Prático
JavaFx - Guia Prático
danielfc
 
Desenvolvimento rápido de aplicações com JEE e JavaFX
Desenvolvimento rápido de aplicações com JEE e JavaFXDesenvolvimento rápido de aplicações com JEE e JavaFX
Desenvolvimento rápido de aplicações com JEE e JavaFX
jesuinoPower
 
Internet das Coisas com Coisas Reais: Java , Things API, Raspberry PI e Toys!
Internet das Coisas com Coisas Reais:  Java , Things API, Raspberry PI e Toys!Internet das Coisas com Coisas Reais:  Java , Things API, Raspberry PI e Toys!
Internet das Coisas com Coisas Reais: Java , Things API, Raspberry PI e Toys!
Globalcode
 
Palestra sobre Carreira Java / JavaEE - TDC2012 - Trlha Java
Palestra sobre Carreira Java / JavaEE - TDC2012 - Trlha JavaPalestra sobre Carreira Java / JavaEE - TDC2012 - Trlha Java
Palestra sobre Carreira Java / JavaEE - TDC2012 - Trlha Java
Globalcode
 
Criando aplicações java fx em minutos
Criando aplicações java fx em minutosCriando aplicações java fx em minutos
Criando aplicações java fx em minutos
Bruno Oliveira
 
Boas práticas na criação de aplicações sérias com JavaFX - TDC 2014 SP
Boas práticas na criação de aplicações sérias com JavaFX - TDC 2014 SPBoas práticas na criação de aplicações sérias com JavaFX - TDC 2014 SP
Boas práticas na criação de aplicações sérias com JavaFX - TDC 2014 SP
jesuinoPower
 
JavaFX 8, Collections e Lambdas
JavaFX 8, Collections e LambdasJavaFX 8, Collections e Lambdas
JavaFX 8, Collections e Lambdas
jesuinoPower
 
JavaFX no Falando em Java 2007 - Sergio Lopes
JavaFX no Falando em Java 2007 - Sergio LopesJavaFX no Falando em Java 2007 - Sergio Lopes
JavaFX no Falando em Java 2007 - Sergio Lopes
Caelum
 
JavaFX Mobile
JavaFX MobileJavaFX Mobile
JavaFX Mobile
Claudiney Marques
 
Programação Estruturada 2 - Aula 06
Programação Estruturada 2 - Aula 06Programação Estruturada 2 - Aula 06
Programação Estruturada 2 - Aula 06
thomasdacosta
 
Mini-curso JavaFX Aula1
Mini-curso JavaFX Aula1Mini-curso JavaFX Aula1
Mini-curso JavaFX Aula1
Raphael Marques
 
Estrutura de Dados - Aula 04
Estrutura de Dados - Aula 04Estrutura de Dados - Aula 04
Estrutura de Dados - Aula 04
thomasdacosta
 
Introdução a Application Life-cycle Management Open Source
Introdução a Application Life-cycle Management Open SourceIntrodução a Application Life-cycle Management Open Source
Introdução a Application Life-cycle Management Open Source
Globalcode
 
Android com Arduino: como integrar via bluetooth, Google ADK ou wi-fi
Android com Arduino: como integrar via bluetooth, Google ADK ou wi-fiAndroid com Arduino: como integrar via bluetooth, Google ADK ou wi-fi
Android com Arduino: como integrar via bluetooth, Google ADK ou wi-fi
Globalcode
 
Classes Java , JDBC / Swing / Collections
Classes Java , JDBC / Swing / Collections Classes Java , JDBC / Swing / Collections
Classes Java , JDBC / Swing / Collections
Eduardo Carvalho
 

Destaque (20)

Enterprise JavaBeans simples e descomplicado, na prática
Enterprise JavaBeans simples e descomplicado, na práticaEnterprise JavaBeans simples e descomplicado, na prática
Enterprise JavaBeans simples e descomplicado, na prática
 
Ria e Java FX
Ria e Java FXRia e Java FX
Ria e Java FX
 
Conhecendo Java
Conhecendo JavaConhecendo Java
Conhecendo Java
 
Campus Party 2014 - Internet das Coisas com coisas reais
Campus Party 2014 - Internet das Coisas com coisas reaisCampus Party 2014 - Internet das Coisas com coisas reais
Campus Party 2014 - Internet das Coisas com coisas reais
 
JavaFX: Abordagem Prática
JavaFX: Abordagem PráticaJavaFX: Abordagem Prática
JavaFX: Abordagem Prática
 
JavaFx - Guia Prático
JavaFx - Guia PráticoJavaFx - Guia Prático
JavaFx - Guia Prático
 
Desenvolvimento rápido de aplicações com JEE e JavaFX
Desenvolvimento rápido de aplicações com JEE e JavaFXDesenvolvimento rápido de aplicações com JEE e JavaFX
Desenvolvimento rápido de aplicações com JEE e JavaFX
 
Internet das Coisas com Coisas Reais: Java , Things API, Raspberry PI e Toys!
Internet das Coisas com Coisas Reais:  Java , Things API, Raspberry PI e Toys!Internet das Coisas com Coisas Reais:  Java , Things API, Raspberry PI e Toys!
Internet das Coisas com Coisas Reais: Java , Things API, Raspberry PI e Toys!
 
Palestra sobre Carreira Java / JavaEE - TDC2012 - Trlha Java
Palestra sobre Carreira Java / JavaEE - TDC2012 - Trlha JavaPalestra sobre Carreira Java / JavaEE - TDC2012 - Trlha Java
Palestra sobre Carreira Java / JavaEE - TDC2012 - Trlha Java
 
Criando aplicações java fx em minutos
Criando aplicações java fx em minutosCriando aplicações java fx em minutos
Criando aplicações java fx em minutos
 
Boas práticas na criação de aplicações sérias com JavaFX - TDC 2014 SP
Boas práticas na criação de aplicações sérias com JavaFX - TDC 2014 SPBoas práticas na criação de aplicações sérias com JavaFX - TDC 2014 SP
Boas práticas na criação de aplicações sérias com JavaFX - TDC 2014 SP
 
JavaFX 8, Collections e Lambdas
JavaFX 8, Collections e LambdasJavaFX 8, Collections e Lambdas
JavaFX 8, Collections e Lambdas
 
JavaFX no Falando em Java 2007 - Sergio Lopes
JavaFX no Falando em Java 2007 - Sergio LopesJavaFX no Falando em Java 2007 - Sergio Lopes
JavaFX no Falando em Java 2007 - Sergio Lopes
 
JavaFX Mobile
JavaFX MobileJavaFX Mobile
JavaFX Mobile
 
Programação Estruturada 2 - Aula 06
Programação Estruturada 2 - Aula 06Programação Estruturada 2 - Aula 06
Programação Estruturada 2 - Aula 06
 
Mini-curso JavaFX Aula1
Mini-curso JavaFX Aula1Mini-curso JavaFX Aula1
Mini-curso JavaFX Aula1
 
Estrutura de Dados - Aula 04
Estrutura de Dados - Aula 04Estrutura de Dados - Aula 04
Estrutura de Dados - Aula 04
 
Introdução a Application Life-cycle Management Open Source
Introdução a Application Life-cycle Management Open SourceIntrodução a Application Life-cycle Management Open Source
Introdução a Application Life-cycle Management Open Source
 
Android com Arduino: como integrar via bluetooth, Google ADK ou wi-fi
Android com Arduino: como integrar via bluetooth, Google ADK ou wi-fiAndroid com Arduino: como integrar via bluetooth, Google ADK ou wi-fi
Android com Arduino: como integrar via bluetooth, Google ADK ou wi-fi
 
Classes Java , JDBC / Swing / Collections
Classes Java , JDBC / Swing / Collections Classes Java , JDBC / Swing / Collections
Classes Java , JDBC / Swing / Collections
 

Semelhante a Java persintence api

Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)
Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)
Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)
Adriano Teixeira de Souza
 
Sistemas Distribuídos - Comunicação Distribuída - EJB
Sistemas Distribuídos - Comunicação Distribuída - EJBSistemas Distribuídos - Comunicação Distribuída - EJB
Sistemas Distribuídos - Comunicação Distribuída - EJB
Adriano Teixeira de Souza
 
JSF & REST
JSF & RESTJSF & REST
JSF & REST
Eduardo Bregaida
 
Repensando padrões e boas práticas java ee
Repensando padrões e boas práticas java eeRepensando padrões e boas práticas java ee
Repensando padrões e boas práticas java ee
Adriano Tavares
 
Java OO Middleware - JEE / EJB / RMI
Java OO Middleware - JEE / EJB / RMIJava OO Middleware - JEE / EJB / RMI
Java OO Middleware - JEE / EJB / RMI
Yitzhak Stone
 
GUJavaSC - Mini-curso Java EE
GUJavaSC - Mini-curso Java EEGUJavaSC - Mini-curso Java EE
GUJavaSC - Mini-curso Java EE
Rodrigo Cândido da Silva
 
Aula JPA
Aula JPAAula JPA
Aula JPA
Marco Reis
 
Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007
Rafael Benevides
 
ApresentaçãO Ejb (Enterprise Java Beans)
ApresentaçãO Ejb (Enterprise Java Beans)ApresentaçãO Ejb (Enterprise Java Beans)
ApresentaçãO Ejb (Enterprise Java Beans)
mauriciopel
 
CDI -Contextos e Dependências
CDI -Contextos e DependênciasCDI -Contextos e Dependências
CDI -Contextos e Dependências
Wende Mendes
 
Spring framework 2.5
Spring framework 2.5Spring framework 2.5
Spring framework 2.5
Diego Pacheco
 
Aula2
Aula2Aula2
Aula2
fkimura
 
Hibernate conceitos
Hibernate conceitosHibernate conceitos
Hibernate conceitos
Elifranio Alves Cruz
 
CDI Extensions e DeltaSpike
CDI Extensions e DeltaSpikeCDI Extensions e DeltaSpike
CDI Extensions e DeltaSpike
Rafael Benevides
 
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0
Elvis Rocha
 
Spring Framework
Spring FrameworkSpring Framework
Spring Framework
Diego Pacheco
 
TDC2012: Usando os recursos de extensibilidade da API de CDI do Java EE 6
TDC2012: Usando os recursos de extensibilidade da API de CDI do Java EE 6TDC2012: Usando os recursos de extensibilidade da API de CDI do Java EE 6
TDC2012: Usando os recursos de extensibilidade da API de CDI do Java EE 6
Dr. Spock
 
Resumo Anotacoes Certificacao SCBCD 5
Resumo Anotacoes Certificacao SCBCD 5Resumo Anotacoes Certificacao SCBCD 5
Resumo Anotacoes Certificacao SCBCD 5
Gilberto Holms
 
Serra StarTec 2013 - Java EE
Serra StarTec 2013 - Java EESerra StarTec 2013 - Java EE
Serra StarTec 2013 - Java EE
Rodrigo Cândido da Silva
 
Produtividade com JavaServer Faces
Produtividade com JavaServer FacesProdutividade com JavaServer Faces
Produtividade com JavaServer Faces
Eduardo Bregaida
 

Semelhante a Java persintence api (20)

Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)
Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)
Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)
 
Sistemas Distribuídos - Comunicação Distribuída - EJB
Sistemas Distribuídos - Comunicação Distribuída - EJBSistemas Distribuídos - Comunicação Distribuída - EJB
Sistemas Distribuídos - Comunicação Distribuída - EJB
 
JSF & REST
JSF & RESTJSF & REST
JSF & REST
 
Repensando padrões e boas práticas java ee
Repensando padrões e boas práticas java eeRepensando padrões e boas práticas java ee
Repensando padrões e boas práticas java ee
 
Java OO Middleware - JEE / EJB / RMI
Java OO Middleware - JEE / EJB / RMIJava OO Middleware - JEE / EJB / RMI
Java OO Middleware - JEE / EJB / RMI
 
GUJavaSC - Mini-curso Java EE
GUJavaSC - Mini-curso Java EEGUJavaSC - Mini-curso Java EE
GUJavaSC - Mini-curso Java EE
 
Aula JPA
Aula JPAAula JPA
Aula JPA
 
Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007
 
ApresentaçãO Ejb (Enterprise Java Beans)
ApresentaçãO Ejb (Enterprise Java Beans)ApresentaçãO Ejb (Enterprise Java Beans)
ApresentaçãO Ejb (Enterprise Java Beans)
 
CDI -Contextos e Dependências
CDI -Contextos e DependênciasCDI -Contextos e Dependências
CDI -Contextos e Dependências
 
Spring framework 2.5
Spring framework 2.5Spring framework 2.5
Spring framework 2.5
 
Aula2
Aula2Aula2
Aula2
 
Hibernate conceitos
Hibernate conceitosHibernate conceitos
Hibernate conceitos
 
CDI Extensions e DeltaSpike
CDI Extensions e DeltaSpikeCDI Extensions e DeltaSpike
CDI Extensions e DeltaSpike
 
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0
 
Spring Framework
Spring FrameworkSpring Framework
Spring Framework
 
TDC2012: Usando os recursos de extensibilidade da API de CDI do Java EE 6
TDC2012: Usando os recursos de extensibilidade da API de CDI do Java EE 6TDC2012: Usando os recursos de extensibilidade da API de CDI do Java EE 6
TDC2012: Usando os recursos de extensibilidade da API de CDI do Java EE 6
 
Resumo Anotacoes Certificacao SCBCD 5
Resumo Anotacoes Certificacao SCBCD 5Resumo Anotacoes Certificacao SCBCD 5
Resumo Anotacoes Certificacao SCBCD 5
 
Serra StarTec 2013 - Java EE
Serra StarTec 2013 - Java EESerra StarTec 2013 - Java EE
Serra StarTec 2013 - Java EE
 
Produtividade com JavaServer Faces
Produtividade com JavaServer FacesProdutividade com JavaServer Faces
Produtividade com JavaServer Faces
 

Mais de Eduardo Carvalho

Introdução ao Java
Introdução ao JavaIntrodução ao Java
Introdução ao Java
Eduardo Carvalho
 
Clean Code - end to end
Clean Code - end to endClean Code - end to end
Clean Code - end to end
Eduardo Carvalho
 
Scrum
ScrumScrum
Pomodoro o que é
Pomodoro o que éPomodoro o que é
Pomodoro o que é
Eduardo Carvalho
 
Servlets 2.5
Servlets 2.5Servlets 2.5
Servlets 2.5
Eduardo Carvalho
 
Teste Driven Development
Teste Driven DevelopmentTeste Driven Development
Teste Driven Development
Eduardo Carvalho
 
Gof design patterns
Gof design patternsGof design patterns
Gof design patterns
Eduardo Carvalho
 
Java e Mercado de Trabalho
Java e Mercado de TrabalhoJava e Mercado de Trabalho
Java e Mercado de Trabalho
Eduardo Carvalho
 

Mais de Eduardo Carvalho (8)

Introdução ao Java
Introdução ao JavaIntrodução ao Java
Introdução ao Java
 
Clean Code - end to end
Clean Code - end to endClean Code - end to end
Clean Code - end to end
 
Scrum
ScrumScrum
Scrum
 
Pomodoro o que é
Pomodoro o que éPomodoro o que é
Pomodoro o que é
 
Servlets 2.5
Servlets 2.5Servlets 2.5
Servlets 2.5
 
Teste Driven Development
Teste Driven DevelopmentTeste Driven Development
Teste Driven Development
 
Gof design patterns
Gof design patternsGof design patterns
Gof design patterns
 
Java e Mercado de Trabalho
Java e Mercado de TrabalhoJava e Mercado de Trabalho
Java e Mercado de Trabalho
 

Java persintence api

  • 1. [ Java Persintence API ] Simplificando a Persistência de Objetos Autor: Eduardo R. Carvalho email: ercarval@gmail.com 7/10/2008 Java Persistence API
  • 2. Agenda ● Requerimentos para o JPA ● Modelo de Codificação do JPA ● Ciclo de Vida do Entity & Entity Manager ● Detached Entities ● Relacionamento entre os Entity ● Mapeamento Objeto Relacional ● Entity Listeners ● Query ● Transações ● Objetos Embutidos ● Chaves Primárias Compostas 7/10/2008 Java Persistence API
  • 3. Agenda ● JPA Overview ● Entities ● Packaging ● EntityManager ● Java EE no Mundo Java SE ● JPQL 7/10/2008 Java Persistence API
  • 4. Requisitos do JPA ● Simplificação do Modelo de Persistência ○ Eliminação da Necessidade de Descritores para Deploy ● Modelo de Persistência Leve ○ Padronizando os Frameworks de O/R ● Testavel fora do Container ○ Possibilidade da Criação de Testes utilizando os Entities sem a necessidade de um Container ● Possibilidade de Utilização de Herança e Polimorfismo ● Mapeamento Objeto Relacional ● Extensa Capacidade de Quering 7/10/2008 Java Persistence API
  • 5. JPA Comum em JSE e JEE ● A API de persistência foi expandida para que também fosse utilizada sem a necessidade de um Container EJB ○ Ela pode ser utilizada em Ambientes JSE, Web e em Aplicações EJB. ● Suporte a implementações de Fornecedores ○ Através do persistence.xml 7/10/2008 Java Persistence API
  • 6. Agenda ● JPA Overview ● Entities ● Packaging ● EntityManager ● Java EE no Mundo Java SE ● JPQL 7/10/2008 Java Persistence API
  • 7. Entity - Característica ● Entity nada mais é do que uma Classe Java que representa um Entidade de Negócio, também conhecido como um POJO (Plain Old Java Object) ● Todo entity possui um id. ● Não há necessidade de implementação de interfaces ● Suporte total a Herança e Polimorfismo ● Serializavel, não havendo a necessidade da criação de DTOs, para Uso de Clientes Remotos ou transferencia entre camadas. ● Suporte a estados não persistentes e persistentes ○ Tipos Simples (primitivos, Wrappers, enums) ○ Objetos Compostos, Composições e Agregações (Ex. Address) ○ Objetos não persistentes, sem estado de persistência (transient) ● Utilização de Anotações do JSE5 7/10/2008 Java Persistence API
  • 8. POJO x Entity POJO 1. public class BankAccount { 2. private Long id; 3. private String accountName; 4. private BigDecimal balance; 5. } Entity Simples ( “ Um POJO promovido ” ) 6. @Entity 7. public class BankAccount { 8. @Id 9. private Long id; 10. private String accountName; 11. private BigDecimal balance; 12. } A Classe é mapeada a Tabela e os atributos são mapeados as colunas 7/10/2008 Java Persistence API
  • 9. @Table 1. @Entity 2. @Table(name="BANK_ACCOUNT") 3. public class BankAccount { 4. @Id 5. private Long id; 6. private String accountName; 7. private BigDecimal balance; 8. } 7/10/2008 Java Persistence API
  • 10. @Version 1. @Entity 2. @Table(name="BANK_ACCOUNT") 3. public class BankAccount { 4. @Id 5. private Long id; 6. @Version 7. private Long version; 8. private String accountName; 9. private BigDecimal balance; 10. } Utilização de Lock Otimista através da Anotação Version 7/10/2008 Java Persistence API
  • 11. @Column 1. @Entity 2. @Table(name="BANK_ACCOUNT") 3. public class BankAccount { 4. @Id 5. private Long id; 6. @Version 7. private Long version; 8. @Column(name="ACCOUNT_NAME") 9. private String accountName; 10. private BigDecimal balance; 11. } ● A Annotation Column permite que você defina o nome da coluna , tamanho , precisão, escala, etc. 7/10/2008 Java Persistence API
  • 12. @Lob 1. @Entity 2. @Table(name="BANK_ACCOUNT") 3. publicclass BankAccount { 4. @Id 5. private Long id; 6. @Version 7. private Long version; 8. @Column(name="ACCOUNT_NAME") 9. private String accountName; 10. private BigDecimal balance; 11. @Lob 12. private String description; 13. } ● A Configuração de Tamanho de um Atributo/Propriedade String padrão é de 255. 7/10/2008 Java Persistence API
  • 13. @Enumerated 1. @Entity 2. @Table(name="BANK_ACCOUNT") 3. public class BankAccount { 4. @Id 5. private Long id; 6. // ... 7. @Enumerated(EnumType.ORDINAL) 8. private AccountStatus status; 9. } 10. public enum AccountStatus { 11. PENDING, APPROVED, ACTIVE; 12. } A Annotation Enumerated Define dois tipos de Enumeration, EnumType : public enum EnumType {ORDINAL, STRING} 7/10/2008 Java Persistence API
  • 14. @Temporal 1. @Entity 2. @Table(name="BANK_ACCOUNT") 3. public class BankAccount { 4. @Id 5. //... 6. @Enumerated(EnumType.ORDINAL) 7. private AccountStatus status; 8. @Temporal(TemporalType.TIMESTAMP) 9. private Date dateCreated; 10. } ● A Annotation TemporalType Define alguns tipos Temporais através da enum : public enum TemporalType {DATE, TIME, TIMESTAMP} 7/10/2008 Java Persistence API
  • 15. @Transient 1. @Entity 2. @Table(name="BANK_ACCOUNT") 3. public class BankAccount { 4. @Id 5. //... 6. @Enumerated(EnumType.ORDINAL) 7. private AccountStatus status; 8. @Temporal(TemporalType.TIMESTAMP) 9. private Date dateCreated; 10. @Transient 11. private BigDecimal calculatedValue; 12. } ● Assim com em classes Serializadas a Annotation Transient indica que o atributo não será persistido. 7/10/2008 Java Persistence API
  • 16. Modificador transient 1. @Entity 2. @Table(name="BANK_ACCOUNT") 3. publicclass BankAccount { 4. @Id 5. //... 6. @Enumerated(EnumType.ORDINAL) 7. private AccountStatus status; 8. @Temporal(TemporalType.TIMESTAMP) 9. private Date dateCreated; 10. private transient BigDecimal calculatedValue; 11. } ● O Modificador transiente tem a mesma finalidade para os Entities, informar que a o atributo não será Serializado 7/10/2008 Java Persistence API
  • 17. Entity Identification ● A Especificação do JPA exige que todos os Entities informem um Id. Este pode ser um Atributo simples, um tipo definido pelo usuário. Sendo o primeiro um mapeamento para uma coluna no banco de dados representando uma chave primaria. O Segundo uma determinação de chave composta, ou seja múltiplas colunas no banco de dados. 7/10/2008 Java Persistence API
  • 18. Persistent ID ● @Id – Define a chave primaria a um atributo ou propriedade ● @EmbeddedId – Mapeia um Entity a um Atributo/Propriedade ● @IdClass – Mapear multiplos atributos / propriedades, para compor uma chave primaria composta. ● Classes que representam chaves primarias 7/10/2008 Java Persistence API
  • 19. Chave Primária Simples 1. @Entity 2. public class BankAccount { 3. @Id 4. private Long id; 5. // ... 6. } 7/10/2008 Java Persistence API
  • 20. Chaves Compostas 1º. Adicione a Annotation @IdClass 2º. Crie a Classe de que representa em BankAccount a Chave (POJO) 1. @Entity 1. public class BankAccountKey 2. @Table(name="BANK_ACCOUNT") 2. implements Serializable { 3. @IdClass(BankAccountKey.class) 3. private Long id; 4. public class BankAccount { 4. private Long secondId; 5. @Id 5. } 6. private Long id; 7. @Id 8. private Long secondId; 9. } 7/10/2008 Java Persistence API
  • 21. Chaves Compostas 2º. Crie a Classe de que representa 1º. Adicione a a Chave (POJO) e Adicione a Annotation Annotation @Embeddable @EmbeddedId em 1. @Embeddable BankAccount 2. public class BankAccountKey 3. implements Serializable { 4. private Long id; 5. private Long secondId; 1. @Entity 6. } 2. @Table(name=" BANK_ACCOUNT") 3. public class BankAccount { 4. @EmbeddedId 5. private BankAccountKey id; 6. } 7/10/2008 Java Persistence API
  • 22. Geração de Chaves Primárias ● Use @GeneratedValue para definir a geração da Chave Primaria ● Estratégias de Geração Disponíveis 1. public enum GenerationType { 2. TABLE, SEQUENCE, IDENTITY, AUTO 3. }; ● De preferência ao Tipo AUTO sempre que possível, visando a portabilidade. 7/10/2008 Java Persistence API
  • 23. Relacionamentos com JPA ● Suporte a Composição e Agregação ● Relacionamentos do Tipo : one-to-one, one-to-many, many-to-one, many-to-many ● Relacionamento unidirecionais e bidirecionais ● Relacionamentos bidirecionais são administrados pela aplicação e não pelo provedor de persistência (persistence provider). ● Em um relacionamento bidirecional não há um proprietário, mas sim um referencia cruzada entre eles. 7/10/2008 Java Persistence API
  • 24. Relacionamentos Bidirecionais User 1 1 Address user address 1. @Entity 2. @Table(name="address") 3. public class Address { address 4. @Id 5. private Integer id; id streetAddress user_id 6. @OneToOne 7. private User user; 8. private String streetAddress; 9. } 10. @Entity 11. public class User { 12. @Id 13. private Integer id; 14. @OneToOne(cascade=CascadeType.ALL, mappedBy="user") 15. private Address address; 16. } 7/10/2008 Java Persistence API
  • 25. Gerenciamento de Relacionamentos User 1 1 Address user address 1. @Entity 2. public class User { 3. @Id 4. private Integer id; 5. @OneToOne(cascade=CascadeType.ALL, 6. mappedBy="user") 7. private Address address; 8. public void setAddress(Address address) { 9. this.address = address; 10. address.setUser (this); 11. } 12. } 7/10/2008 Java Persistence API
  • 26. Composição ● O Relacionamento de Composição define um relacionamento forte entre dois objetos, sendo um o proprietário do outro e o responsável pelo ciclo de vida deste objeto. ● Use a Annotation @Embedded e @Embeddable para determinar o relacionamento de composição ● Deteminar a Separação Logica entre os Entities ● Ambos os Entities serão persistidos na mesma tabela 7/10/2008 Java Persistence API
  • 27. Composição @Embeddable public class UserDetail { @Entity private String firstName; @Table(name="user") private String lastName; public class User { } @Embedded private UserDetail userDetail; private String username; private String password; } 7/10/2008 Java Persistence API
  • 28. Agregação ● O Relacionamento de Agregação define que existe um relacionamento entre as partes. Mas não há um proprietário e cada um é responsável pelo seu próprio ciclo de vida, pode estar associado a outras entidades. ● As Annotations @ManyToOne, @OneToMany, @ManyToMany e @OneToOne definem o uso de Agregação entre Entities. 7/10/2008 Java Persistence API
  • 29. Cascade & FetchType ● JPA prove suporte a operações do tipo Cascade, através do enum CascadeType public enum CascadeType { ALL, PERSIST, MERGE, REMOVE, REFRESH }; ● JPA também possui suporte a carregamento tardio (Lazy) e eager fetching para relacionamentos public enum FetchType { LAZY, EAGER }; 7/10/2008 Java Persistence API
  • 30. Many-to-One ● A Annotation @ManyToOne é utilizada relacionamentos de muitos para um. ● Deve ser utilizada para representar o objeto de referencia ● A Annotation @JoinColumn é utilizada para chaves estrangeiras 7/10/2008 Java Persistence API
  • 31. Many-to-One @Entity public class BankAccount implements Serializable { // ... @ManyToOne(optional=false, fetch=FetchType.LAZY) @JoinColumn(name="created_by_user_id") private User createdBy; } * O Elemento optional indica que a coluna pode ser nula ou não 7/10/2008 Java Persistence API
  • 32. One-to-Many ● Use a Annotation @OneToMany para determinar o um Relacionamento de Um Para Muitos, não sendo ela a proprietária pelo relacionamento. ● A Associação do tipo one-to-many representa uma Coleção de Obejtos. ● Use @JoinColumn para definir chaves estrangeiras ● A Annotation @OrderBy é utilizada para 7/10/2008 Java Persistence API
  • 33. One-to-Many 1. @Entity 2. @Table(name="user") 3. public class User { 4. @OneToMany(mappedBy="createdBy") 5. @OrderBy("dateCreated DESC") 6. private List<BankAccount> accounts; 7. } ● A Tabela BankAccount contém a chave estrangeira created_by_user_id ● A annotation @OneToMany não possui elementos opcionais, pois não é proprietário do dado. 7/10/2008 Java Persistence API
  • 34. Many-to-Many ● Use a Annotation @ManyToMany em ambos os lados do relacionamento para representar coleções de dados em ambos os lados. ● Ambos os lados são proprietarios do dado ● Use a annotation @JoinTable no lado proprietário para determinar a tabela de ligação. ● Compartilha os mesmos elementos de @OneToMany 7/10/2008 Java Persistence API
  • 35. Many-to-Many @Entity public class Role { @ManyToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY) @JoinTable( name = "user_role", joinColumns = @JoinColumn( name = "user_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn( name = "role_id", referencedColumnName = "id") ) protected Set<User> users = new HashSet<User>(); } 7/10/2008 Java Persistence API
  • 36. One-to-One User 1 1 Address user address ● Utiliza a Annotation @OneToOne em ambos os lados do relacionamento ● Não Existe um proprietário pelo relacionamento, ambos os lados são responsáveis por este. ● Compartilha os mesmos elementos de @ManyToOne 7/10/2008 Java Persistence API
  • 37. Herança 7/10/2008 Java Persistence API
  • 38. Herança ● JPA tem total suporte a herança através das annotations @MappedSuperclass e @Inheritance ● Suporte a um modelo híbrido, pois é possível mesclar em sua hierarquia de classes , Entities e Não-Entities, classes concretas e abstratas ● Use @MappedSuperclass para determinar atributos comuns no modelo ● Use @Inheritance determinar 7/10/2008 Java Persistence API
  • 39. @MappedSuperclass 7/10/2008 Java Persistence API
  • 40. MappedSuperclass 7/10/2008 Java Persistence API
  • 41. @MappedSuperclass 1. @MappedSuperclass 2. public abstract class ModelBase { 3. @Id 4. private Integer id; 5. @Version 6. private Integer version; 7. } 8. @Entity 9. public class User extends ModelBase { 10. @Column(name="USER_NAME") 11. private String username; 12. } 13. @Entity 14. public class BankAccount extends ModelBase { 15. private String accountName; 16. } 7/10/2008 Java Persistence API
  • 42. @Inheritance 7/10/2008 Java Persistence API
  • 43. @Inheritance ● Os Entities podem conter subclasses ○ Classe NON-Entity Concreta ou Abstrata ○ Classe Entity Concreta ou Abstrata ● A Especificação do JPA suporta Três Estratégias de Herança para Entities ○ SINGLE_TABLE: Uma Tabela para toda Hierarquia ○ JOINED : Cada Entity (Concreto ou Abstrato) na Hierarquia representa uma tabela. ○ TABLE_PER_CLASS: (Opcional) Uma 7/10/2008 Tabela por Classe Concreta. Java Persistence API
  • 44. SINGLE_TABLE 1. @Entity 2. @Inheritance(strategy=SINGLE_TABLE) 3. @DiscriminatorColumn(name="type", 4. discriminatorType=STRING) 5. public abstract class Rank { 6. ... 7. protected String rankName; 8. protected String avatar ; 9. } 10. @Entity 11. @DiscriminatorValue("SPECIAL_RANK") 12. public class SpecialRank 13. extends Rank { 14. protected String message; RANK 15. } Id Type RankName Avatar Message minimumPostCount 16. @Entity 1 POST_CO firstRank Junior 5 UNT .jpg 17. @DiscriminatorValue("POST_COUNT") 2 SPECIAL Newbie New. New 18. public class PostCountRank _RANK jpg member 19. extends Rank { 20. protected 21. Integer minumumPostCount; 22. } 7/10/2008 Java Persistence API
  • 45. JOINED 1. @Entity 2. @Inheritance(strategy=JOINED) 3. public abstract class Rank { 4. protected String rankName; 5. protected String avatar; 6. } 7. @Entity RANK 8. public class SpecialRank Id RankName Avatar 9. extends Rank { 1 firstRank Junior.jpg 10. protected String message; 2 Newbie New.jpg 11. } PostCountRANK 12. @Entity SpecialRANK Id minimumPostCount 13. public class PostCountRank Id Message Newbie Newbie 1 2 14. extends Rank { 15. protected Integer minimumPostCount; 16. } 7/10/2008 Java Persistence API
  • 46. TABLE_PER_CLASS 1. @Entity 2. @Inheritance(strategy=TABLE_PER_CLASS) 3. public abstract class Rank { 4. @Id @GeneratedValue( 5. strategy=GenerationType.TABLE) 6. private Long id; 7. } 8. @Entity 9. public class SpecialRank SPECIALRANK 10. extends Rank { Id Type RankName Avatar Message 11. protected String message; 12. } 1 POST_CO firstRank Junior UNT .jpg 2 SPECIAL Newbie New. New 13. @Entity _RANK jpg member 14. public class PostCountRank 15. extends Rank { 16. protected POSTCOUNTRANK 17. Integer minimumPostCount; Id Type RankN Avatar minimumPost ame Count 18. } 1 POST_ firstR Junior. 5 COUNT ank jpg 2 SPECI Newbie New.jpg AL_RA NK 7/10/2008 Java Persistence API
  • 47. Agenda ● JPA Overview ● Entities ● Packaging ● EntityManager ● Java EE no Mundo Java SE ● JPQL 7/10/2008 Java Persistence API
  • 48. Packaging O Único XML necessário 7/10/2008 Java Persistence API
  • 49. Empacote seus Entities ● A Especificação de JPA necessita de um único XML de configuração, este fica no diretório ○ META-INF/persistence.xml ○ Define o nome do unidade de persistencia (persistence unit) ○ Determina Estratégia de Transação para o EntityManager ○ Identifica os Entities que estão contidos na unidade de persistencia ○ Define as Configurações do provedor de persistencia ● Você também pode criar o arquivo de mapeamento objeto-relacional ○ Ele é muito parecido com o .hbm.xml do Hibernate ○ Pode ser alterado, ou sobrescrever as annotations ○ Ele é Identificado como persistence.xml 7/10/2008 Java Persistence API
  • 50. persistence.xml <persistence ...> <persistence-unit name="djbug" transaction-type="RESOURCE_LOCAL"> <provider> org.hibernate.ejb.HibernatePersistence </provider> <mapping-file>META-INF/orm-mapping.xml</mapping-file> <class>org.ujug.jpa.model.BankAccount</class> <properties> <property name="hibernate.show_sql" value="false" /> </properties> </persistence-unit> </persistence> ● transaction-type pode ser configurado como : ○ JTA ○ RESOURCE_LOCAL 7/10/2008 Java Persistence API
  • 51. Terminologia JPA ● Persistence Unit (Unidade de Persistencia) : Nome Lógico dado a um grupo de Entities, definidos usando o elemento persistence-unit em persistence.xml ○ <persistence-unit name="djbug" ... > ● Persistence Context – O nome dado a uma Coleção de Entities em tempo de execução, gerenciados pelo EntityManager 7/10/2008 Java Persistence API
  • 52. Agenda ● JPA Overview ● Entities ● Packaging ● EntityManager ● Java EE no Mundo Java SE ● JPQL 7/10/2008 Java Persistence API
  • 53. EntityManager 7/10/2008 Java Persistence API
  • 54. EntityManager ● Principal diferença entre JSE e JEE é a utilização do EntityManager ● Muito similar a inteface Session do Hibernate ● Ele que prove a acesso ao Persistence Context ● Prove Serviços do tipo CRUD persist, remove, find, merge, etc. ● Prove Interface para Transaction API ● Factory para a API de Query. 7/10/2008 Java Persistence API
  • 55. EM & Persistence Context ● São segregados em dois tipos ○ Gerenciados pelo Container ( JEE ) através da annotation @PersistenceCotext ○ Gerenciada pela Aplicação (JSE/JEE) através do EntityManagerFactory para recuperar a referencia, fica a cargo da aplicação a responsabilidade sobre a gestão do ciclo de vida do EntityManager ● Dois tipos de Contexto de Persistencia ○ Transacional 7/10/2008 ○ Entendido (extended persistence context) Java Persistence API
  • 56. EM – Gerenciado pelo Container ● Escopo de Transação gerenciado pelo container através do persistence.xml <persistence-unit ... transaction-type=" JTA"> @PersistenceContext(type=TRANSACTION) protected EntityManager entityManager; @PersistenceContext(type=EXTENDED) protected EntityManager entityManager; 7/10/2008 Java Persistence API
  • 57. EM – Gerenciado pela Aplicação ● Pode ser utilizado tanto em ambientes JSE quanto em JEE ● Necessidade de finalizar o EM. ● Fica a cargo da Aplicação determinar a utilização de transações ● EM é provido pelo EntityManagerFactory ● Utiliza ExtendedPersistenceContext, devido a determinação do ciclo de vida do EM delegado a aplicação. 7/10/2008 Java Persistence API
  • 58. EM – Gerenciado pela Aplicação ● No ambiente JEE pode ser utilizado a annotation @PersitenceUnit @PersistenceUnit EntityManagerFactory emf; ● No ambiente JSE é necessário a utilização da classe Persistence EntityManagerFactory emf = Persistence.createEntityManagerFactory(“season"); 7/10/2008 Java Persistence API
  • 59. EM – Gerenciado pela Aplicação @PersistenceUnit EntityManagerFactory emf; public User createUser(String username, String password, String email) { User u = null; EntityManager em = emf.createEntityManager(); try { u = new User(); u.setUsername(username); u.setPassword(password); u.getUserDetail().setEmailAddress(email); em.getTransaction().begin(); em.persist(u); em.getTransaction().commit(); } finally { em.close(); } return u; } // @PersistenceUnit 7/10/2008 é aplicávelJava Persistence API containers JEE 5 somente a
  • 60. EM – Gerenciado pela Aplicação public User createUser(String username, String password, String email) { User u = null; EntityManagerFactory emf = Persistence.createEntityManagerFactory("ujug"); EntityManager em = emf.createEntityManager(); try { u = new User(); u.setUsername(username); u.setPassword(password); u.getUserDetail().setEmailAddress(email); em.getTransaction().begin(); em.persist(u); em.getTransaction().commit(); } finally { em.close(); emf.close(); } return u; } 7/10/2008 Java Persistence API
  • 61. Métodos de Callback e Listeners ● Os métodos de callback são determinados nos entities e classes no-entities ○ void methodName() ○ void methodName (Object entity) ● Métodos de callback/listeners são registrados de acordo com as annotations abaixo ● @PrePersist/@PostPersist ● @PreUpdate/@PostUpdate – persistence provider dependent ● @PreRemove/@PostRemove ● @PostLoad 7/10/2008 Java Persistence API
  • 62. Métodos de Callback e Listeners 1. // Para Registrar um callback basta criar um metodo e 2. // adicionar uma annotation de ciclo de vida. 3. @MappedSuperclass 4. public abstract class ModelBase { 5. @PrePersist 6. public void setDates() { 7. Date now = new Date(); 8. if (dateCreated == null) { 9. dateCreated = now; 10. } 11. dateUpdated = now; 12. } 13. } 7/10/2008 Java Persistence API
  • 63. Registrando a Classe de Listener ● Utilizando um Listener @MappedSuperclass @EntityListeners({ModelListener.class}) public abstract class ModelBase { // fields and methods removed for readability } ● Implementando um Listener public class ModelListener { @PrePersist public void setDates(ModelBase modelBase) { Date now = new Date(); if (modelBase.getDateCreated() == null) modelBase.setDateCreated(now); modelBase.setDateUpdated(now); } } 7/10/2008 Java Persistence API
  • 64. Agenda ● JPA Overview ● Entities ● Packaging ● EntityManager ● Java EE no Mundo Java SE ● JPQL 7/10/2008 Java Persistence API
  • 65. Java EE no Java SE Provido por Spring 7/10/2008 Java Persistence API
  • 66. Use Spring como Ponte para JEE ● Utilizar o suporte JPA provido pelo Spring ● Spring provê integração com JPA , implementando as responsabilidades do Container ● Utiliza os Provedores de Persistencia (Hibernate,TopLink) ● Habilita Annotations @PersistenceContext em aplicações JSE ● Para mais informações acesse a documentação do Spring 2.0 7/10/2008 Java Persistence API
  • 67. Agenda ● JPA Overview ● Entities ● Packaging ● EntityManager ● Java EE no Mundo Java SE ● JPQL 7/10/2008 Java Persistence API
  • 68. JPQL Aceita SQL ?? 7/10/2008 Java Persistence API
  • 69. JPQL - Visão Geral ● Independente de Banco de Dados ● Suporte a projeção para classe no-entity ● Suporte a funções de agregação ex. max , min, avg, etc. ● Suporte a Atualizações em Lote update e delete ● Suporte a subquery ● Suporte a inner e outer joins ● Suporte a queries dinâmicas e estáticas (named) ● Sintaxe JPQL semelhante a SQL ■ select from [where] [group by] [having] [order 7/10/2008 by] Java Persistence API
  • 70. Query API ● Utiliza o EntityManager para obter a instancia do Objeto Query Query q = em.createQuery(“query string”); ● API de Query permite: ○ Controle de paginação ○ Definir Maximo de resultados retornados ○ Utilização de nome da definição de parâmetros para as queries ou por posição 7/10/2008 Java Persistence API
  • 71. Criando uma Query ● EntityManager query related methods: public Query createQuery(String qlString); public Query createNamedQuery(String name); public Query createNativeQuery(String sqlString); public Query createNativeQuery(String sqlString, Class resultClass); public Query createNativeQuery(String sqlString, String resultSetMapping); @PersistenceContext protected EntityManager entityManager; public List findAll() { Query q = entityManager.createQuery("select user from User u"); return q.getResultList(); } 7/10/2008 Java Persistence API
  • 72. Queries Estáticas e Dinâmicas ● Queries Estaticas são definidas através das Annotation @NamedQuery e retornadas através do metodo ○ EntityManager.createNamedQuery() ● Queries Dinamicas são definidas através do metodo ○ EntityManager.createQuery() ● Tanto as Queries Estaticas quanto queries Dinamicas podem utilizar Query Pre-Compiladas 7/10/2008 Java Persistence API
  • 73. Exemplo de Query Dinamica 1. Query q = em.createQuery("SELECT u FROM User u " + 2. “WHERE u.username = ?1"); 3. q.setParameter(1, "mac"); 4. q.setFirstResult(10); // numbered from 0 5. q.setMaxResults(10); // only fetch 10 6. List results = q.getResultList(); 7/10/2008 Java Persistence API
  • 74. Exemplo de Query Estatica ● Definindo query: ● @Entity ● @NamedQuery(name="user.updatedAtIP", query="select u ● from User u where u.updatedAtIP like :ip") ● public class User extends ModelBase { ● // removed for readibility... ●} ● Utilizando a Query acima: ● Query q = em.createNamedQuery("user.updatedAtIP"); ● q.setParameter("ip", "127.0.0.1"); ● q.setFirstResult(9); // numbered from 0 ● q.setMaxResults(10); // only fetch 10 ● List results = q.getResultList(); 7/10/2008 Java Persistence API
  • 75. Navegando no Objeto ● Suporte a navegação entre os entities relacionados na clausula Select, utilizando o operador (.) para acessar atributos simples, não coleções. ○ select p.toUser.userIPAddresses from PrivateMessage p ● Utilize a palavra Chave join para acessar atributos definidos em coleções ○ select r.name from User u join u.roles r 7/10/2008 Java Persistence API
  • 76. Bibliografia ● EJB 3.0 In Action ○ [ISBN : 1-933988-34-7] ● JPA 101: Java Persistence Explained ○ [ISBN : 0-9765534-1-4] 7/10/2008 Java Persistence API