quarta-feira, 30 de janeiro de 2008

Introdução à Jpa (Java Persistence API)

Neste artigo criaremos um pequeno exemplo utilizando a jpa.

A JPA (Java Persistence API) faz o mapeamento objeto-relacional, ou seja, traduz o mundo objetos do java para o mundo relacional dos bancos de dados.
Trata-se apenas de uma especificação, ou seja, a implementação ficará por conta de terceiros como:

  • Hibernate
  • TopLink
  • Kodo
  • etc

    Em nosso exemplo utilizaremos o Hibernate. Para obtê-lo é necessário fazer o download de algumas bibliotecas do site http://hibernate.org:
  • Hibernate Core
  • Hibernate EntityManager

    Ao descompactar estes arquivos observa-se uma grande quantidade de .jar's. Após fazer alguns testes notei que os imprescindíveis são:
    antlr-2.7.6.jar
    asm.jar
    cglib-2.1.3.jar
    commons-collections-2.1.1.jar
    commons-logging-1.0.4.jar
    dom4j-1.6.1.jar
    hibernate-annotations.jar
    hibernate-commons-annotations.jar
    hibernate-entitymanager.jar
    hibernate3.jar
    javassist.jar
    jboss-archive-browsing.jar
    jta.jar
    persistence.jar
    
    Inicialmente criaremos a classe contato. Observe no código abaixo a existência de algumas anotações.
    @Entity
    
    Define uma entidade. Usamos esta anotação para dizer que a classe anotada é uma entidade, portanto, será persistida no banco de dados.
    @Id
    
    Define o campo que conterá o identificador da entidade. Será a chave primaria da tabela.
    @GeneratedValue(strategy=SEQUENCE, generator = "geradorPessoa")
    @SequenceGenerator(name="geradorPessoa", sequenceName = "gerador_pessoa")
    
    Configurações para utilizar um Sequence do banco de dados.
    Classe Contato
    package org.jchico.jpa;

    import static javax.persistence.GenerationType.SEQUENCE;

    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.SequenceGenerator;

    @Entity
    public class Contato {

     
    @Id
       @GeneratedValue
    (strategy=SEQUENCE, generator = "geradorPessoa")
      
    @SequenceGenerator(name="geradorPessoa", sequenceName = "gerador_pessoa")
      
    private int codigo;
     
    private String nome;
     
    private String telefone;
     
    private String endereco;

     
    public int getCodigo() {
       
    return codigo;
     
    }
     
    public void setCodigo(int codigo) {
       
    this.codigo = codigo;
     
    }
     
    public String getNome() {
       
    return nome;
     
    }
     
    public void setNome(String nome) {
       
    this.nome = nome;
     
    }
     
    public String getTelefone() {
       
    return telefone;
     
    }
     
    public void setTelefone(String telefone) {
       
    this.telefone = telefone;
     
    }
     
    public String getEndereco() {
       
    return endereco;
     
    }
     
    public void setEndereco(String endereco) {
       
    this.endereco = endereco;
     
    }
    }



    Agora criaremos a classe TesteContatoJpa. Esta classe será responsável por persistir os contatos. Note a necessidade da existência do EntityManager. Ele é o gerenciador de entidades. Este gerenciador é capaz de persistir, listar, remover, alterar, etc as entidades.
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("exemplo");
    EntityManager em = emf.createEntityManager();
    EntityTransaction tx = em.getTransaction();
    
    Para fazer consultas é necessário utilizar a JPAQL:
    Query query = em.createQuery("select e from Contato e");
    


    Classe TesteContatoJpa
    package org.jchico.jpa;

    import java.util.List;
    import java.util.Scanner;

    import javax.persistence.EntityManager;
    import javax.persistence.EntityManagerFactory;
    import javax.persistence.EntityTransaction;
    import javax.persistence.Persistence;
    import javax.persistence.Query;

    public class TesteContatoJpa {

      
    public static void main(String[] args) {
         
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("exemplo");
          EntityManager em = emf.createEntityManager
    ();
          EntityTransaction tx = em.getTransaction
    ();
         
         
    //cria um contato e ajusta seus valores
         
    Contato contato = new Contato();
          Scanner scan =
    new Scanner(System.in);
          System.out.print
    ("\nDigite o nome:");
          contato.setNome
    (scan.nextLine());
          System.out.print
    ("\nDigite o endereço:");
          contato.setEndereco
    (scan.nextLine());
          System.out.print
    ("\nDigite o telefone:");
          contato.setTelefone
    (scan.nextLine());
         
         
    //adiciona um contato no banco
         
    tx.begin();
          em.persist
    (contato);
          tx.commit
    ();
         
         
    //listar os contatos
         
    Query query = em.createQuery("select e from Contato e");
          List<Contato> listaContatos = query.getResultList
    ();
         
    for(Contato c : listaContatos){
            
    System.out.printf("%20s %20s %20s", c.getNome(), c.getEndereco(), c.getTelefone());
         
    }
       }
    }



    Agora veja o persistence.xml abaixo. Este arquivo deverá ficar no diretório META-INF da sua aplicação. Neste arquivo realizamos as configurações necessárias para a JPA, como o driver do banco, a url, usuario e senha.
    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="1.0"
     xmlns="http://java.sun.com/xml/ns/persistence"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
     <persistence-unit name="exemplo">
      <class>org.jchico.jpa.Contato</class>
      <properties>
                <property name="hibernate.hbm2ddl.auto" value="update"/>
                <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
                <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/>
                <property name="hibernate.connection.username" value="sa"/>
                <property name="hibernate.connection.password" value=""/>
                <property name="hibernate.connection.url" value="jdbc:hsqldb:hsql://localhost/exemplo"/>
                <property name="hibernate.show_sql" value="true"/>
            </properties>
        </persistence-unit>
    </persistence>
    
    
    Espero que você tenha gostado desta informação.

  • 3 comentários:

    Anônimo disse...

    chico, foi boa a maneira a qual vc abordou o assunto, fazendo comentarios, mostrando habilidade de expor o assunto.
    Está bom..e continue mandando informações, tanto para profissionais
    avançados quanto para os que começando.

    Anônimo disse...

    tudo bem francisco...
    faça um video de jpa com mysql..
    obrigado.

    Márcia disse...

    Ainda bem que tinha o endereço do seu blog e após meses de curso posso consultar/relembrar da aulaJpa. Continue escrevendo!