Listar Tudo Generico

Ola Pessoal… estou com uma duvida para fazer um metodo que lista todos os elementos de uma tabela do meu banco, mas essa lista tem que ser generica para poder listar todas as minhas classes( no caso o meu metodo listaTudo())… eu estou usando o Hibernate… e tentei fazer isso aqui embaixo mas nao ta dando certo… se alguem puder dar uma luz eu agradeçooo…

obrigado!!


import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;

public class GenericoHibernateDao<T> implements Dao<T>  {
	
	private Session session;
	private Class classePersistente;
	private T t;
	
	public GenericoHibernateDao(Session session, T t){
		
		this.session = session;
		this.t = t;
		this.classePersistente = (Class) t;
		
	}

	@Override
	public void salva(T t) {

		this.session.beginTransaction();
		this.session.save(t);
		this.session.getTransaction().commit();
		
		
	}

	@Override
	public void remove(T t) {

		this.session.delete(t);
		
	}

	@Override
	public void atualiza(T t) {

		this.session.update(t);
	}
	@Override
	public List<T> listaTudo() {
		
		

		return session.createCriteria(classePersistente).list();
		
	}

}

Erro


Exception in thread "main" java.lang.ClassCastException: br.com.jp.hibernate.Produto cannot be cast to java.lang.Class
	at br.com.jp.hibernate.GenericoHibernateDao.<init>(GenericoHibernateDao.java:18)
	at br.com.jp.hibernate.TestaDaoGenerico.main(TestaDaoGenerico.java:16)
    this.classePersistente = (Class) t; 

tenta trocar por:

    this.classePersistente = t.class;

quando eu faço isso o eclipse sugere que eu crie uma classe t ou uma interface t

Tenta:

 this.classePersistente = t.getClass() ;  

Muito Obrigado amigo… deu certo com o getClass.

Uma dúvida sobre o seu código. Para que serve isso:

private T t;

Você não usa esse t em nenhum outro lugar da classe.
Para salvar, remover e atualizar você passa um novo t como parâmetro.
Para listar, não é necessário.

Você pode excluir esse atributo e alterar seu construtor para:

  public GenericoHibernateDao(Session session, Class&lt;T&gt; clazz) {
    this.session = session;  
    this.classePersistente = clazz;
  }

Pode inclusive, declarar o atributo classePersistente com o tipo genérico:

  private Class&lt;T&gt; classePersistente;

Enfim, são apenas algumas sugestões.

veja se isso ajuda

[code]package br.com.projeto.dao;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.persistence.OrderBy;
import javax.persistence.criteria.Order;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;

import br.com.projeto.beans.ItensDeServico;
import br.com.projeto.beans.OrdemDeServico;
import br.com.projeto.util.HibernateUtil;

public class HibernateDao implements InterfaceDao {

private Class<T> classe;

public HibernateDao(Class<T> classe) {
	super();
	this.classe = classe;
}	

@Override
public void salvar(T bean) {
	Session session = HibernateUtil.getSf().openSession();
	session.beginTransaction();
	session.save(bean);
	session.getTransaction().commit();
}

@Override
public void deletar(T bean) {
	Session session = HibernateUtil.getSf().getCurrentSession();
	session.beginTransaction();
	session.delete(bean);
	session.getTransaction().commit();
}

@Override
public void atualizar(T bean) {
	Session session = HibernateUtil.getSf().getCurrentSession();
	session.beginTransaction();
	session.update(bean);
	session.getTransaction().commit();		
}

@Override
public List<T> getBeans() {
	Session session = HibernateUtil.getSf().openSession();
	session.beginTransaction();
	List<T> beans = (List<T>) session.createCriteria(classe).list();
	session.getTransaction().commit();
	return beans;
}

@Override
public T getBean(Serializable id) {
	Session session = HibernateUtil.getSf().openSession();
	session.beginTransaction();
	T bean = (T) session.get(classe, id);
	session.getTransaction().commit();
	return bean;
}

public List<T> getBeansItens(Serializable id){
	Session session = HibernateUtil.getSf().getCurrentSession();
	session.beginTransaction();
	List<T> beans = (List<T>) session.createQuery("from ItensDeServico where id_ordemDeServico="+id).list();
	session.getTransaction().commit();
	return beans;
}


public void deletarVarios(List<ItensDeServico> itensDeServico){
	Session session = HibernateUtil.getSf().getCurrentSession();
	ItensDeServico iten = new ItensDeServico();
	for (int i = 0; i < itensDeServico.size(); ++i){
	iten = itensDeServico.get(i);
	session.beginTransaction();
	session.delete(iten);
	session.getTransaction().commit();
	}
}


public List<T> getBeansData(String data3, String data4){
	Session session = HibernateUtil.getSf().getCurrentSession();
	session.beginTransaction();
	List<T> beans = (List<T>) session.createQuery("FROM OrdemDeServico WHERE dataFechamento BETWEEN '"+data3+"' AND '"+data4+"'").list();
	session.getTransaction().commit();
	return beans;
}

public List<T> getBeansOrdem() {
	Session session = HibernateUtil.getSf().getCurrentSession();
	session.beginTransaction();
	Criteria criteria = session.createCriteria(classe);
	criteria.addOrder(org.hibernate.criterion.Order.desc("idOrdemDeServico"));
	List<T> beans = criteria.list();
	session.getTransaction().commit();
	return beans;
}

}
[/code]

[quote=michelorth_92]veja se isso ajuda

[code]package br.com.projeto.dao;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.persistence.OrderBy;
import javax.persistence.criteria.Order;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;

import br.com.projeto.beans.ItensDeServico;
import br.com.projeto.beans.OrdemDeServico;
import br.com.projeto.util.HibernateUtil;

public class HibernateDao implements InterfaceDao {

private Class<T> classe;

public HibernateDao(Class<T> classe) {
	super();
	this.classe = classe;
}	

@Override
public void salvar(T bean) {
	Session session = HibernateUtil.getSf().openSession();
	session.beginTransaction();
	session.save(bean);
	session.getTransaction().commit();
}

@Override
public void deletar(T bean) {
	Session session = HibernateUtil.getSf().getCurrentSession();
	session.beginTransaction();
	session.delete(bean);
	session.getTransaction().commit();
}

@Override
public void atualizar(T bean) {
	Session session = HibernateUtil.getSf().getCurrentSession();
	session.beginTransaction();
	session.update(bean);
	session.getTransaction().commit();		
}

@Override
public List<T> getBeans() {
	Session session = HibernateUtil.getSf().openSession();
	session.beginTransaction();
	List<T> beans = (List<T>) session.createCriteria(classe).list();
	session.getTransaction().commit();
	return beans;
}

@Override
public T getBean(Serializable id) {
	Session session = HibernateUtil.getSf().openSession();
	session.beginTransaction();
	T bean = (T) session.get(classe, id);
	session.getTransaction().commit();
	return bean;
}

public List<T> getBeansItens(Serializable id){
	Session session = HibernateUtil.getSf().getCurrentSession();
	session.beginTransaction();
	List<T> beans = (List<T>) session.createQuery("from ItensDeServico where id_ordemDeServico="+id).list();
	session.getTransaction().commit();
	return beans;
}


public void deletarVarios(List<ItensDeServico> itensDeServico){
	Session session = HibernateUtil.getSf().getCurrentSession();
	ItensDeServico iten = new ItensDeServico();
	for (int i = 0; i < itensDeServico.size(); ++i){
	iten = itensDeServico.get(i);
	session.beginTransaction();
	session.delete(iten);
	session.getTransaction().commit();
	}
}


public List<T> getBeansData(String data3, String data4){
	Session session = HibernateUtil.getSf().getCurrentSession();
	session.beginTransaction();
	List<T> beans = (List<T>) session.createQuery("FROM OrdemDeServico WHERE dataFechamento BETWEEN '"+data3+"' AND '"+data4+"'").list();
	session.getTransaction().commit();
	return beans;
}

public List<T> getBeansOrdem() {
	Session session = HibernateUtil.getSf().getCurrentSession();
	session.beginTransaction();
	Criteria criteria = session.createCriteria(classe);
	criteria.addOrder(org.hibernate.criterion.Order.desc("idOrdemDeServico"));
	List<T> beans = criteria.list();
	session.getTransaction().commit();
	return beans;
}

}
[/code][/quote]

Neste caso vc esta abrindo a session em cada metodo, mas e pra fechar a session… isso nao pode causar um problema depois?

[quote=AbelBueno]Uma dúvida sobre o seu código. Para que serve isso:

private T t;

Você não usa esse t em nenhum outro lugar da classe.
Para salvar, remover e atualizar você passa um novo t como parâmetro.
Para listar, não é necessário.

Você pode excluir esse atributo e alterar seu construtor para:

  public GenericoHibernateDao(Session session, Class&lt;T&gt; clazz) {
    this.session = session;  
    this.classePersistente = clazz;
  }

Pode inclusive, declarar o atributo classePersistente com o tipo genérico:

  private Class&lt;T&gt; classePersistente;

Enfim, são apenas algumas sugestões.
[/quote]

é realmente o meu “t” nao servia pra nada…hehehe… falha de iniciante…hauhauahu… sugestao aceita… ja ate alterei o meu codigo…abração… e muito obrigado pela ajuda

quando eu dou commit(); ele fecha a sesssão

a ta entendi… eu nao sabia dessa … muito obrigado pelas dicas… ja to usando o seu post como ideia para criar os meus metodos…hehe