Bem, vc sempre pode melhorar um código… alguns outros métodos podem ser inseridos ai para vc melhorar a sua base de acesso a dados.
Mas uma coisa me deixou curioso: porque vc faz um método salvar, um outro atualizar e mais um saveOrUpdate?!? E porque vc está usando nomes em português e em inglês ao mesmo tempo?!?
L
Leonardo3001
É bom lembrar que nem sempre aplicações comerciais se baseiam em CRUD. Pode haver uma regra de que determinada linha de uma tabela não pode ser excluída ou que em tal tabela não se pode pesquisar tudo. Nesses casos, o esforço de um DAO genérico pode ser em vão.
ricardosoares
aproveitando o tópico…
Todos DAOs que fiz foi copiado de um exemplo tirado da net. Dessa forma, mantive os nomes de métodos como “findById”, “listAll”, etc.
Uma curiosidade: qual o idioma mais usado nestes casos? O inglês ou o dos programadores envolvidos?
rodrigoallemand
Neste caso, segue-se a direção dada pelo cliente, seja ele um cliente externo ou vc mesmo… normalmente eu coloco tudo em inglês…
Já numa camada mais acima (de negocio, como um Service da vida) é rotina eu colocar os nomes em portugues e o mais ‘entendivel’ possivel. As vezes eu penso em mudar isso tb, colocando tudo no mesmo formato, mas…
Exceções devem ser tratadas como exceções… e até mesmo nesses casos, um método genérico tb irá te ajudar… portanto, se vc utiliza em mais de um componente do seu sistema um mesmo método, vc deve tornar tal método extensivel… usando-se genérics, melhor ainda!
Tem um tópico meu aqui no GUJ (não estou com tempo pra procurar) onde eu implemento um GenericDAO bem completo… fiquem a vontade pra procurar nas minhas mensagens! É bem antigo… quase 1 ano, acho eu!
Giulliano
Cara…seu DAO genérico esta bacana e tals…só que tem uns métodos tipados com <Usuario> e <Cliente>.
Vc concorda que se o DAO é genérico ele deve conter métodos genéricos.
Outra coisa eu acho que vc poderia usar o DAO gnérico para métodos comuns como insert, update , select * e tal.
Depois quando precisar de métodos mais especificos vc cria oura classe DAO extendendo a primeira classe com os métodos já definido e cria os outros mais especificos…
fui claro ???
victorcosta
Vê minha DAO Genérica
Acho q tah melhor mas n testei muito ela!
packagestruts.model.dao;importjava.io.Serializable;importjava.util.List;importorg.hibernate.Query;importorg.hibernate.Session;importstruts.model.util.HibernateUtil;/** * Instantiating: * GenericDAO<User, Long> userDAO = new GenericDAO<User, Long>(User.class); * * Extending: * public class UserDAO extends GenericDAO<User, Long> { * * public UserDAO() { * super(User.class); * } * * // Add new methods here * } */publicclassGenericDAO<T,IDextendsSerializable>{privateClass<T>persistentClass;privateStringclassName;@SuppressWarnings("unchecked")publicGenericDAO(Class<T>persistentClass){this.persistentClass=persistentClass;String[]tokens=persistentClass.toString().split("[.]");this.className=tokens[tokens.length-1];}publicClass<T>getClassObject(){returnpersistentClass;}publicStringgetClassName(){returnclassName;}publicSessiongetSession(){returnHibernateUtil.getSessionFactory().getCurrentSession();}publicvoidsave(Tentity){getSession().save(entity);}publicvoidupdate(Tentity){getSession().clear();getSession().update(entity);}publicvoiddelete(IDid){getSession().delete(getSession().load(persistentClass,id));}@SuppressWarnings("unchecked")publicTfindById(IDid){return(T)getSession().get(persistentClass,id);}/** * Example of use: userDAO.find("WHERE login = ?", "vcac") */@SuppressWarnings("unchecked")publicTfind(Stringclausule,Object...parameters){Queryquery=getSession().createQuery("from "+className+" "+clausule);intcount=0;for(Objectparameter:parameters)query.setParameter(count++,parameter);return(T)query.uniqueResult();}@SuppressWarnings("unchecked")publicList<T>findAll(){return(List<T>)getSession().createCriteria(persistentClass).list();}@SuppressWarnings("unchecked")publicList<T>findAll(intpage,intresultsPerPage){return(List<T>)getSession().createCriteria(persistentClass).setFirstResult((page-1)*resultsPerPage).setMaxResults(resultsPerPage).list();}/** * Example of use: userDAO.findAll("WHERE name LIKE ?", "Victor%") */@SuppressWarnings("unchecked")publicList<T>findAll(Stringclausule,Object...parameters){Queryquery=getSession().createQuery("from "+className+" "+clausule);intcount=0;for(Objectparameter:parameters)query.setParameter(count++,parameter);return(List<T>)query.list();}publicLongcount(){return(Long)getSession().createQuery("select count(*) from "+className).uniqueResult();}publicvoidflush(){getSession().flush();}}
Giulliano
Sua DAO esta idêntica a DAO dele… :shock:
E, na minha opnião, um pouco pior pois esta recebendo uma classe como parametro sendo que a classe já é do tipo tipada (Generics).