[RESOLVIDO] Riscos da Solução Encontrada

2 respostas
oliversistemas

Gostaria que saber se a solução que encontrei pode me dar dores de cabeça no futuro.

Contexto: Trata-se de um projeto Java Web desenvolvido em Eclipse. Usa JSF 2.0 (com primefaces 2.2.1), Hibernate e banco de dados PostgreSQL. Problema que eu tinha: no pacote de arquivos de consulta ao banco (dao) implementei uma classe abstrata denominada AbstractDAO. Até então, esta não é uma novidade para muitos programadores. Nesta classe implementei 2 métodos:
public class AbstractDAO {
protected Session sessao;

	public void salvarOuAlterar(Object object) throws Exception {
		//implementacao
	}

	public void excluir(Object object) throws Exception {
		//implementacao
	}
}
O meu problema era ter um método abstrato que fosse capaz de trazer do banco de dados todos os registros de qualquer classe que eu escolhesse. Resolvi assim na classe abstrata, com o método listarTodos:
public class AbstractDAO {
protected Session sessao;

	public void salvarOuAlterar(Object object) throws Exception {
		//implementacao
	}

	public void excluir(Object object) throws Exception {
		//implementacao
	}

    public List<?> listarTodos(Class<?> classParaSerListado) throws Exception {
		Transaction transaction = null;

		try {
			sessao = HibernateUtil.getSessionFactory().openSession();
			transaction = sessao.beginTransaction();
			Criteria criteria = sessao.createCriteria(classParaSerListado);
			transaction.commit();

			return (List<?>) criteria.list();

		} catch (Exception e) {
			transaction.rollback();
			throw new Exception("Erro ao Pesquisar");
		} finally {
			// sessao.close();
		}
	}
}
Eis agora uma classe de exemplo que estende o AbstractDAO:
public class TipoDePodaDAO extends AbstractDAO {
//nada aqui
 }

E, por fim como ficou a classe que faz uso do método listarTodos:

// import SUPRIMIDOS

@ManagedBean
@SessionScoped
public class TipoDePodaBacking {

	private TipoDePodaDAO tipoDePodaDAO = new TipoDePodaDAO();
	
	private List<TipoDePoda> listaPesquisada;

	@SuppressWarnings("unchecked")
	public void listarTudo() {
		try {
			listaPesquisada = (List<TipoDePoda>) tipoDePodaDAO
					.listarTodos(TipoDePoda.class);
		} catch (Exception e) {
			FacesMessage msg = new FacesMessage("Erro ao pesquisar", null);
			FacesContext.getCurrentInstance().addMessage(null, msg);
		}
	}
}

As linhas que interessam ser discutidas aqui no GUJ são as 14 e 15 deste último código fonte.
Antes eu tinha um grave problema de "cast", agora não mais.
Gostaria de saber, principalmente de quem já usou Hibernate, se poderei ter problemas neste tipo de busca, visto que ela será utilizada apenas para tabelas com poucos registros, aproximadamente 500, com acesso de, no máximo 20 usuários ao mesmo tempo.

2 Respostas

FieroddPJ

Bom dia!

Esse seu método listarTodos é um select sem critérios, então não vejo nenhum grande problema a não ser o que vc já mencionou que irá evitar, que é executá-lo em tabelas muito grandes. Veja se consegue simular esse seu pior caso, que é executar esses 20 selects simultaneamente numa tabela com 500 registros.

Sugestão: pq não usa generics para os outros métodos também?

oliversistemas

Generics? Vou dar uma pesquisada.
Obrigado pela sugestão.

Criado 14 de maio de 2011
Ultima resposta 16 de mai. de 2011
Respostas 2
Participantes 2