Primeiro post depois de perder minha acc:
Eu vi em alguns posts uma discução sobre criar um dao generico. O problema é que ele não ficava tipado e haviam varios casts no codigo cliente.
Eu fiz uma solução aqui e gostaria de compartilhar:
Repositorio Generico
[code]public interface GenericRepository {
/**
* @param instance
*/
public void save(T instance);
/**
 * @param id
 * @return
 */
public T findById(Integer id);
/**
 * @return
 */
public List<T> findAll();
/**
 * @param begin
 * @param end
 * @return
 */
public List<T> findAll(Integer begin, Integer end);
/**
 * @param example
 * @return
 */
public List<T> findByExample(T example);
/**
 * @param example
 * @param begin
 * @param end
 * @return
 */
public List<T> findByExample(T example, Integer begin, Integer end);
/**
 * @param isntance
 */
public void remove(T isntance);
}[/code]
O repositorio Pessoa
[code]public interface PessoaRepository extends GenericRepository {
}
[/code]
O DAO generico, usando o hibernate template do Spring.
[code]public class GenericDAO extends HibernateDaoSupport implements GenericRepository {
private static final Log log = LogFactory.getLog(GenericDAO.class);
private final Class typeClass;
/**
 * @param argClass
 */
public GenericDAO(Class argClass) {
	typeClass = argClass;
}
/* (non-Javadoc)
 * @see com.navita.model.repository.GenericRepository#save(null)
 */
public void save(T instance) {
	log.debug("saving " + instance.getClass().getName() + " instance");
	try {
		getHibernateTemplate().saveOrUpdate(instance);
		log.debug("save successful");
	} catch (RuntimeException re) {
		log.error("save failed", re);
		throw re;
	}
	
}
/* (non-Javadoc)
 * @see com.navita.model.repository.GenericRepository#findById(java.lang.Long)
 */
public T findById(Integer id) {
	log.debug("getting " + typeClass + " instance with id: " + id);
	try {
		T instance = (T) getHibernateTemplate().get(typeClass, id); 
		return instance;
	} catch (RuntimeException re) {
		log.error("get failed", re);
		throw re;
	}
}
/* (non-Javadoc)
 * @see com.navita.model.repository.GenericRepository#findAll()
 */
public List<T> findAll() {
      log.debug("finding all " + typeClass.getName() + " instances");
      try {
          List<T> results = (List<T>) getHibernateTemplate().loadAll(typeClass);
          log.debug("findAll successful, result size: " + results.size());
          return results;
      } catch (RuntimeException re) {
          log.error("findAll failed", re);
          throw re;
      }
}
/* (non-Javadoc)
 * @see com.navita.model.repository.GenericRepository#findAll(java.lang.Integer, java.lang.Integer)
 */
public List<T> findAll(Integer begin, Integer end) {
      log.debug("finding all " + typeClass.getName() + " instances from: " + begin + " to: " + end);
      try {
    	  DetachedCriteria criteria = DetachedCriteria.forClass(typeClass);
          List<T> results = (List<T>) getHibernateTemplate().findByCriteria(criteria, begin, end);
          log.debug("findAll successful, result size: " + results.size());
          return results;
      } catch (RuntimeException re) {
          log.error("findAll failed", re);
          throw re;
      }
}
/* (non-Javadoc)
 * @see com.navita.model.repository.GenericRepository#findByExample(null)
 */
public List<T> findByExample(T example) {
	return findByExample(example, -1, -1);
}
/* (non-Javadoc)
 * @see com.navita.model.repository.GenericRepository#findByExample(T, java.lang.Integer, java.lang.Integer)
 */
public List<T> findByExample(T example, Integer begin, Integer end) {
      log.debug("finding " + example.getClass().getName() + " instance by example from: " + begin + " to: " + end);
      try {    	  
          List<T> results = (List<T>) getHibernateTemplate().findByExample(example, begin, end); 
          log.debug("find by example successful, result size: " + results.size());
          return results;
      } catch (RuntimeException re) {
          log.error("find by example failed", re);
          throw re;
      }
}
/* (non-Javadoc)
 * @see com.navita.model.repository.GenericRepository#remove(null)
 */
public void remove(T instance) {
	log.debug("deleting " + instance.getClass().getName() + " instance");
	try {
		getHibernateTemplate().delete(instance);
		log.debug("delete successful");
	} catch (RuntimeException re) {
		log.error("delete failed", re);
		throw re;
	}
}
}
[/code]
O DAO especifico da pessoa
[code]public class PessoaDAO extends GenericDAO implements PessoaRepository {
public PessoaDAO() {
	super(Pessoa.class);
}
}[/code]
Esse código resolve os metodos default para todos os daos. Caso tenha algum metodo com criterio de pesquisa, basta declara-lo no PessoaRepository e implementar no PessoaDAO.
Agora uma dúvida, eu tive que passar como arg no construtor do GenericDAO a classe específica para o hibernate template utilizar (typeClass). Isso somente para os metodos findById e para o findAll onde não existe uma instância de pessoa por exemplo.
Agluma ideia melhor?