JPA2 -> CRUD + Generics [Parte 1]

Versão do Post[1.5]


Opa galera, tudo certo?
Bem.. vou fazer um CRUD basico com JPA2, ando estudando bastante sobre JPA2 e sinceramente.. gostei mais de brincar com ele do que o Hibernate em si (sei-la.. achei mais divertido), bem vamos la
Primeiro passo: Criar o JPAUtil no pacote br.com.lafleur.faroljava.infra

package br.com.lafleur.faroljava.infra

import javax.persistence.EntityManager
import javax.persistence.EntityManagerFactory
import javax.persistence.Persistence

public class JPAUtil{
   private static EntityManagerFactory entityManagerFactory = Persistence.CreateEntityManagerFactory("controledecontas");
   public EntityManager getEntityManager(){
      return entityManagerFactory.createEntityManager();
   }
}

Agora precisamos criar nosso DAO Generico

package br.com.lafleur.faroljava.DAO

import javax.persistence.EntityManager;
import java.util.List;

public class DAO<T>{
   private final EntityManager em;
   private final Class<T> classe;

   public DAO(EntityManager em, Class<T> classe){
      this.em = em;
      this.classe = classe;
   }
   //Metodos de CRUD genericos

   public T busca(Integer id){
      return this.em.getReference(classe, id);
   }

   public List<T> lista(){
      return em.createQuery("from " + classe.getName()).getResultLit();
   }

   public void adiciona(T t){
      this.em.persist(t);
   }

   public void remove(T t){
      this.em.remove(t);
   }
}

Beleza, ja temos o JPAUtil e o DAO generico, no nosso pequeno projeto, vamos criar uma Conta, mas quais atributos uma conta normalmente tem ? Um titular, uma agencia, um numero e um banco.. coisas basicas por enquanto ^^.
Precisamos então criar nossa entitdade conta

package br.com.lafleur.faroljava.modelo

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

@Entity
public class Conta{
   @GeneratedValue @Id
   private Integer id;
   private String titular;
   private String agencia;
   private String numero;
   private String banco;

   //Getters and Setters
}

E nossa ContaDAO no pacote br.com.lafleur.faroljava.dao

package br.com.lafleur.faroljava.dao.Conta

import javax.persistence.EntityManager;
import java.util.List;
import br.com.lafleur.faroljava.modelo.Conta;

public class ContaDAO{
   private final DAO<Conta> dao;
   private final EntityManager em;

  public ContaDAO(EntityManager em({
     this.dao = new DAO<Conta>(em, Conta.class);
     this.em = em;
   }

   public void adiciona(Conta conta){
      this.dao.adiciona(conta);
   }

   public void remove(Conta conta){
      this.dao.remove(conta);
   }

   public List<Conta> lista(){
      return this.dao.lista();
   }

   public Conta busca(Integer id){
      return dao.busca(id);
   }
}

Pra finalizar agente precisa ainda de duas coisas basicas, primeira, a nossa classe de testes
e segundo nosso persistence.xml, o persistence.xml seria a mesma coisa que o hibernate.cfg.xml.
Criando o persistence.xml: O “diferente” do persistence.xml é que ele ao inves de ficar na pasta src como o hibernate.cfg ele fica na META-INF dentro de src.
Beleza, vamos criar o persistence.xml

<pre><persistence 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_2_0.xsd"
 version="2.0">
// Passamos o persistence-unit no EntityManagerFactory do JPAUtil
 <persistence-unit name="controledecontas">
 <provider>org.hibernate.ejb.HibernatePersistence</provider>

 <class>br.com.lafleur.faroljava.modelo.Conta</class>

 <properties>
 <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect" />
 <property name="hibernate.hbm2ddl.auto" value="update" />
 <property name="hibernate.show_sql" value="true" />
 <property name="hibernate.format_sql" value="true" />

 <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
 <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/Faroljava" />
 <property name="javax.persistence.jdbc.user" value="root" />
 <property name="javax.persistence.jdbc.password" value="UseSeuPassword" />
 </properties>

 </persistence-unit>
</persistence>

Pronto nosso persistence.xml foi criado dentro de META-INF da pasta src.

E nossa ContaDAO no pacote br.com.lafleur.faroljava.dao
Não esquecam de criar um FOLDER dentro do src e nomea-lo META-INF

package br.com.lafleur.faroljava.teste;
import javax.persistence.EntityManager;
import br.com.lafleur.faroljava.dao.ContaDAO;
import br.com.lafleur.faroljava.infra.JPAUtil;
import br.com.lafleur.faroljava.modelo.Conta;

public class InsereContaTestDriver{
   public static void main(String arg[]){
   EntityManager em = new JPAUtil().getEntityManager();
   ContaDAO dao = new ContaDAO(em);

   Conta c = new Conta();
   c.setAgencia("Itau");
   c.setBanco("Itau");
   c.setNumero("7777-7");
   c.setTitular("Max Mustang");
   c.setBanco("7777");
   em.getTransaction().begin();
   dao.adiciona(c);
   em.getTransaction().commit();
   }
}

Pronto,  ja temos um insert com JPA2, para os proximos post vamos implementar os outros metodos o/

Jesus Love you <3

3 Comentários

Filed under Hibernate, Java, JPA2, OpenSource

3 Respostas a JPA2 -> CRUD + Generics [Parte 1]

  1. Pingback: Login com JSF2 « Farol Java

  2. mateus

    Muito bom, e as outras partes :D

  3. Eder

    legal, mas o entity manager nao poderia ficar no DAO ? Assim nao seria necessário criá-lo em cada tabela do modelo.

Deixar um comentário

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Modificar )

Imagem do Twitter

You are commenting using your Twitter account. Log Out / Modificar )

Facebook photo

You are commenting using your Facebook account. Log Out / Modificar )

Connecting to %s