Críticas construtivas DAO e Hibernate

2 respostas
luciano_castilho

Olá a todos! :D

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! :D

Muito obrigado pessoal! :P :P :P

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();
	}
	
}

2 Respostas

G

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:

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();
    }
Entendeu, assim você evita escrever vários metodos como getListPorNome..... Crie apenas um que receba seu objeto:
getList(CidadeModel){
      createQuery(CidadeModel);
}

Entendeu

TedLoprao

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

Criado 14 de outubro de 2004
Ultima resposta 14 de out. de 2004
Respostas 2
Participantes 3