POO - Programao Orientada a Objetos POO Programao Orientada a Objetos O Dao Genrico Jefferson S. Silva IFET - PI Copyright Jefferson S. Silva Slide 2 POO - Programao Orientada a Objetos Dao Genrico Se fssemos adicionar outra entidade no sistema, um Produto, por exemplo, como voc escreveria o ProdutoDao? Provavelmente, copiaria todo o contedo do UsuarioDao, substituindo Usuario por Produto. Isso porque, com o Hibernate, a lgica de acesso a dados muito parecida quando tratamos de entidades diferentes. 2 Copyright Jefferson S. Silva Slide 3 POO - Programao Orientada a Objetos Dao Genrico Copiar e colar cdigo nunca legal. Modificaes futuras tm que ser feitas em vrias lugares, sempre com a chance de se esquecer algum. Seria legal centralizar tudo em um lugar s. Seria legal no precisar criar um dao especfico para cada entidade. Copyright Jefferson S. Silva Slide 4 POO - Programao Orientada a Objetos Dao Genrico Vamos fazer uma nica classe Dao que usa Generics <T> e, portanto, pode servir a entidades diferentes sem precisar copiar e colar cdigo. 3 Copyright Jefferson S. Silva Slide 5 POO - Programao Orientada a Objetos Dao Genrico Use o Refactor chamado Rename para renomear a nossa classe UsuarioDao para Dao. Essa classe ser depois generalizada para funcionar com qualquer entidade. Copyright Jefferson S. Silva Slide 6 POO - Programao Orientada a Objetos Dao Genrico Adicionar generics nossa classe: a) Na assinatura da classe, adicione o tipo <T> genrico: public class Dao<T> { 4 Copyright Jefferson S. Silva Slide 7 POO - Programao Orientada a Objetos Dao Genrico Vamos adicionar controle de transaes na nossa Dao. Ela deve ter mtodos para comear uma transao, fazer commit e rollback. Alm disso, adicione um mtodo que verifica se existe uma transao em aberto e outro para fechar tudo. Copyright Jefferson S. Silva Slide 8 POO - Programao Orientada a Objetos Comear uma transao public void beginTransaction() { this.transaction = this.session.beginTransaction(); } 5 Copyright Jefferson S. Silva Slide 9 POO - Programao Orientada a Objetos Commit public void commit() { this.transaction.commit(); this.transaction = null; } Copyright Jefferson S. Silva Slide 10 POO - Programao Orientada a Objetos Rollback public void rollback() { this.transaction.rollback(); this.transaction = null; } 6 Copyright Jefferson S. Silva Slide 11 POO - Programao Orientada a Objetos Verifica se existe uma transao em aberto public boolean hasTransaction() { return this.transaction != null; } Copyright Jefferson S. Silva Slide 12 POO - Programao Orientada a Objetos Fechar sesso public void close() { this.session.close(); } 7 Copyright Jefferson S. Silva Slide 13 POO - Programao Orientada a Objetos ListaTudo public List<Object> listaTudo(Class classe) { return this.session.createCriteria(classe).list(); } Altere o mtodo listaTudo para receber como parmetro a classe que ser listada. Copyright Jefferson S. Silva Slide 14 POO - Programao Orientada a Objetos Procura public Object procura(Long id,Class classe) { return (Object) session.load(classe, id); } Altere o mtodo procura para receber tambm a classe que ser procurada. 8 Copyright Jefferson S. Silva Slide 15 POO - Programao Orientada a Objetos Salva public Object salva (Object dto,boolean evict) throws Exception { try{ this.beginTransaction(); dto = this.session.merge(dto); this.commit(); if(evict) this.session.evict(dto); }catch(Exception e){ this.rollback(); throw new Exception(e.getCause()); } return dto; }// retorna o objeto persistente Copyright Jefferson S. Silva Slide 16 POO - Programao Orientada a Objetos Remove public void remove (Object dto)throws Exception { try{ this.beginTransaction(); this.session.delete(dto); this.commit(); }catch(Exception e){ this.rollback(); throw new Exception(e.getMessage()); } } 9 Copyright Jefferson S. Silva Slide 17 POO - Programao Orientada a Objetos Desafio 1 Crie um mtodo salva que receber como parmetro apenas o objeto a ser salvo e por padro ele dever sempre executar o comando this.session.evict(dto); Copyright Jefferson S. Silva Slide 18 POO - Programao Orientada a Objetos Desafio 2 Crie um mtodo salvaLista que ir salvar todos os objetos de um ArrayList passado como parmetro.Essa operao deve ser protegida por uma transao. 10 Copyright Jefferson S. Silva Slide 19 POO - Programao Orientada a Objetos Testando os refactorings Depois de todos esses passos de refatorao, nosso sistema deve continuar funcionando da mesma forma que antes. Verifique isso rodando o TestaUsuarios e vendo se ele ainda funciona.