Ola Seres Java!Dando continuidade ao post anterior, demonstrarei o emprego do padrao DAO para realizar a persistencia por meio da especificacao JPA. O uso do pattern DAO, alem de prover um melhor design para aplicacao, agregar principios de boas praticas, propicia um melhor reaproveitamento de implementacao.Segundo o Core J2EE Patterns, um Data Access Object:Access to data varies depending on the source of the data. Access to persistent storage, such as to a database, varies greatly depending on the type of storage (relational databases, object-oriented databases, flat files, and so forth) and the vendor implementation.Desta forma, entende-se que emprego de um DAO na aplicacao propicia um ponto central, para acesso a dados, fazendo uso de um quantitativo de classes relativamente pequenos.Tomando como base o projeto implementado no post anterior, sera acrescida a estrutura de persistencia por meio do DAO Generico, assim, segue-se:Criacao da Interface DAO, esta devera listar os metodos comuns a serem implementados por todos os DAOs:Interface DAO:package br.com.serjava.persistencia.dao;import java.io.Serializable;import java.util.List;import javax.persistence.EntityManager;public interface DAO<T, I extends Serializable> { public T save(T entity); public void remove(T entity); public T getById(Class<T> classe, I pk); public List<T> getAll(Class<T> classe); public EntityManager getEntityManager();}Uma vez concluido a interface DAO, criaremos uma classe abstrata (ou seja, so podera ser extendida por outra, e nao instanciada) denominada DAOImpl, esta contera a implementacao generica dos metodos comuns:DAOImpl:package br.com.serjava.persistencia.dao.impl;import java.io.Serializable;import java.util.List;import javax.persistence.EntityManager;import javax.persistence.NoResultException;import br.com.serjava.persistencia.dao.DAO;import br.com.serjava.persistencia.util.Conexao;public abstract class DAOImpl<T, I extends Serializable> implements DAO<T, I>{ private Conexao conexao; @Override public T save(T entity) { T saved = null; getEntityManager().getTransaction().begin(); saved = getEntityManager().merge(entity); getEntityManager().getTransaction().commit(); return saved; } @Override public void remove(T entity) { getEntityManager().getTransaction().begin(); getEntityManager().remove(entity); getEntityManager().getTransaction().commit(); } @Override public T getById(Class<T> classe, I pk) { try { return getEntityManager().find(classe, pk); } catch (NoResultException e) { return null; } } @SuppressWarnings("unchecked") @Override public List<T> getAll(Class<T> classe) { return getEntityManager().createQuery("select o from " + classe.getSimpleName() + " o").getResultList(); } @Override public EntityManager getEntityManager() { if (conexao == null) { conexao = new Conexao(); } return conexao.getEntityManager(); }}Uma vez criada a implementacao base, resta-nos criar a interface que descrevera os metodos de um DAO referente a produto, que e a nossa entidade mapeada pelo JPA, assim temos que:ProdutoDAO:package br.com.serjava.persistencia.dao;import br.com.serjava.persistencia.entity.Produto;public interface ProdutoDAO extends DAO<Produto, Integer> {}Observem que a interface para Produto, e um DAO, como pode ser observado, esta extends a interface DAO padrao. Neste momento a estrutura generica criada e tipada, quando informou-se: [...] extends DAO<Produto..., em outras palavras, estamos dizendo ao compilador da JVM que os metodos basicos herdados do DAO por ProdutoDAO, aceitarao exclusivamente objetos de Produto, desta forma, em tempo de compilacao, se acidentalmente um desenvolvedor passar como parametro um objeto que nao seja de Produto, sera lancado um erro de compilacao.E, finalmente, tem-se a implementacao de ProdutoDAO:ProdutoDAOImpl:package br.com.serjava.persistencia.dao.impl;import br.com.serjava.persistencia.dao.ProdutoDAO;import br.com.serjava.persistencia.entity.Produto;public class ProdutoDAOImpl extends DAOImpl<Produto, Integer> implements ProdutoDAO {}Feito isto, temos nossa estrutura de persistencia generica, e sua implementacao para persistirmos um objeto de Produto, na classe Main, criada no post anterior, demonstrarei o processo para se salvar e listar os objetos salvos:public class Main { public static void main(String... args) { Produto produto = new Produto(); produto.setNomeProduto("produto"); produto.setQuantidade(22); produto.setValor(33.99); ProdutoDAO produtoDAO