Críticas construtivas DAO e Hibernate

Olá a todos! :smiley:

Sou um iniciante no mundo dos DAOs + Hibernate, assim gostaria de colher algumas opniões do pessoal mais experiente nessas ferramentas e tirar dúvidas sobre este assunto.

Primeiramente criei um DAO que faz as operações básicas para uma tabela/obj Cidade, como esse DAO foi baseado em exemplos diversos (leia-se ctrl+c ctrl+v) a verdade é que alguns conceitos não estão bem entendidos, assim gostaria que dessem uma olhada no código e fizessem observações e críticas construtivas.

Algumas observações e dúvidas:

  1. Antes de mais nada criei a configuração do pool c3po do hibernate;
  2. No construtor CidadeDAO() obtenho o sessionFactory = cfg.buildSessionFactory(); É correto obter a sessionFactory no construtor e consequentemente a cada instanciação do DAO?
  3. Da forma que foi implementado este DAO esta utilizando corretamente o pool de conexões c3po? Ou sem saber estou iniciando vários pools a cada instanciação do DAO?
  4. Caso esteja errado, qual seria a maneira correta de implementar esse DAO?
  5. Qualquer comentário e dicas são muito bem vindos! :smiley:

Muito obrigado pessoal! :stuck_out_tongue: :stuck_out_tongue: :stuck_out_tongue:

[code]public class CidadeDAO {

private SessionFactory sessionFactory;

public CidadeDAO() throws Exception {
	Configuration cfg = new Configuration();
	cfg.addClass(Cidade.class);
	//cfg.setProperty("hibernate.show_sql", "true");
	this.sessionFactory = cfg.buildSessionFactory();

}

public Cidade getById(Integer Id) throws HibernateException {
	Session session = sessionFactory.openSession();
	Cidade cidade = (Cidade) session.get(Cidade.class, Id);
	session.flush();
	session.close();
	return cidade;
}

public List getList() throws HibernateException {
	Session session = sessionFactory.openSession();
	List list = session.find("select c from Cidade c");
	session.flush();
	session.close();
	return list;
}

public List getListFirst(int qtd) throws HibernateException {
	Session session = sessionFactory.openSession();
	Query query =
		session.createQuery("from Cidade as c order by c.idCidade");
	query.setMaxResults(qtd);
	List list = query.list();
	session.flush();
	session.close();
	return list;
}

public List getListLast(int qtd) throws HibernateException {
	Session session = sessionFactory.openSession();
	Query query =
		session.createQuery("from Cidade as c order by c.idCidade desc");
	query.setMaxResults(qtd);
	List list = query.list();
	session.flush();
	session.close();
	return list;
}

public List getListByNome(String nomeCidade) throws HibernateException {
	Session session = sessionFactory.openSession();
	List list =
		session.find(
			"select c from Cidade c where c.nomeCidade like :nomeCidade",
			nomeCidade.toUpperCase() + "%",
			Hibernate.STRING);
	session.flush();
	session.close();
	return list;
}

public List getListByEstado(String idEstado) throws HibernateException {
	Session session = sessionFactory.openSession();
	List list =
		session.find(
			"select c from Cidade c where c.idEstado = :idEstado",
			idEstado,
			Hibernate.STRING);
	session.flush();
	session.close();
	return list;
}

public void save(Cidade cidade) throws HibernateException {
	Session session = sessionFactory.openSession();
	Transaction transaction = session.beginTransaction();
	try {
		session.saveOrUpdateCopy(cidade);
		transaction.commit();
	} catch (HibernateException e) {
		transaction.rollback();
		throw e;
	} finally {
		session.close();
	}
}

public void delete(Cidade cidade) throws HibernateException, SQLException {
	Session session = sessionFactory.openSession();
	session.delete(cidade);
	session.flush();
	session.connection().commit();
	session.close();
}

}[/code]

Olá,

Aconselho a você criar um metodo de pesquisa genérico que retorne uma lista de acordo com o seu objeto, ou seja se o id do seu objeto estiver preenchido você adiciona em sua consulta “cidade.id =”+objeto.getId() e assim consecutivamente…

Exemplo de um metodo que faz isso:

[code]

protected String createQueryByModel(AgenciaModel model) {
AgenciaModel agencia = (AgenciaModel) model;
boolean concatenaAnd = false;

    StringBuffer queryStr =
        new StringBuffer(
            "select agencia.chave.banco from br.com.rededental.entity.agencia.model.AgenciaModel agencia ");

    if (agencia.getChave().getCodigo() != null && !agencia.getChave().getCodigo().equals("")) {
        if (!concatenaAnd) {
            queryStr.append(" where");
            concatenaAnd = true;
        }
        queryStr.append(" agencia.chave.codigo = '" + String.valueOf(agencia.getChave().getCodigo()) + "'");
    }
    if (!agencia.getDescricao().equals("")) {
        if (!concatenaAnd) {
            queryStr.append(" where");
            concatenaAnd = true;
        } else {
            queryStr.append(" and");
        }
        queryStr.append(" upper(agencia.descricao) like upper('" + agencia.getDescricao() + "%')");
    }

    if (agencia.getChave().getBanco() != null && agencia.getChave().getBanco().getCodigo().intValue() > 0) {
        if (!concatenaAnd) {
            queryStr.append(" where");
            concatenaAnd = true;
        } else {
            queryStr.append(" and");
        }
        queryStr.append(
            " agencia.chave.banco.codigo = " + String.valueOf(agencia.getChave().getBanco().getCodigo()));
    }
    return queryStr.toString();
}[/code]

Entendeu, assim você evita escrever vários metodos como getListPorNome…
Crie apenas um que receba seu objeto:

 getList(CidadeModel){
      createQuery(CidadeModel);
}

Entendeu

Hmmm, Gabriel pelo que entendi vc tá fazendo um esquema baseado em exemplo, para isso o Hibernate já possui suporte através da api de Criteria…

Dá uma olhada no reference do Hibernate, no item “14.6. Example queries”, acho que resolve o seu problema sem precisar fazer esse “spagetthi code”…

Fallow