Dúvidas com "Metodo<t extends tabela>"

6 respostas
ericmaicon

Olá pessoal, bom dia!!

tudo bom?

eu tou com algumas dúvidas aqui q eu não achei por aqui..não sei se foi mal pesquisado..mas vamos lá!!

eu tenho uma classe q todas as minhas classes de negócio extends dela!!

ela chama Tabela...coisa besta mesmo..algo assim:

public class Tabela {

	@Id
	@Column(name="id")
	private Number id;
	
	public Number getId() {
		return id;
	}

	public void setId(Number id) {
		this.id = id;
	}
}

com isso fiz uma classe de conexão..porém eu fiz uma classe q eu especifico o retorno..eu esqueci o nome disso...mas eh algo assim:

public class ServicoDeConexao<T extends Tabela>
{

        public ServicoDeConexao()
	{
		Configuration anot 	= new AnnotationConfiguration();
		sfac 				= anot.buildSessionFactory();
	}

	public T getTabela(String sql)
	{
		Session	session		= sfac.openSession();
		Transaction tx 		= session.beginTransaction();
		
		T tabela;
		
		List lista = new ArrayList();
		
		lista = session.createSQLQuery(sql).list();
		
		if(lista.size()>=1)
			tabela = (T)lista.get(0);
		else
			tabela = null;
		
		tx.commit();
		
		session.close();
		
		return tabela;
	}
}

bom..eu tenho uma tabela (negócio) Usuario...qd eu uso:

ServicoDeConexao<Usuario> servCon = new ServicoDeConexao<Usuario>();
servCon.getTabela(sqlAqui);

era para retornar o Usuario..porém ele dá erro de cast..primeiro de T para Tabela...logo eu removi o Tabela do extends...

public class ServicoDeConexao<T> {

e continuou dando erro..agora porém de T para Usuario..

creio q entenderam o q eu queria fazer né?

queria um List geral..q independente do Negócio utilizado..ele me retornaria ele como um objeto!

outra coisa!

como faço um singleton dessa classe de conexão?
eu não cnsegui por causa do T!!

Obrigado galera!!

6 Respostas

Eder_Peixoto

O que você está utilizando chama-se Genéricos.

A exception referente a cast ocorre toda vez que a JVM não consegue realizar uma coerção, pois os tipos dos objetos em questão não são compatíveis. Como solicita-se que a classe T extenda Tabela, então Usuario tem que extender Tabela.

Obs.: quando suas dúvidas envolverem exception, insira também o trace.

ericmaicon

vlw..desculpa pelo trace!!

seguinte..ela extende!!

minha classe Usuario:

@Entity
@Table(name="Usuario", schema="public")
public class Usuario extends Tabela {
	
	@Column(unique = false, nullable = true, insertable = true, updatable = true, length = 150)
	private String nome;
	
	@Column(unique = true, nullable = false, insertable = true, updatable = true, length = 20)
	private String usuario;
	
	@Column(unique = false, nullable = false, insertable = true, updatable = true, length = 20)
	private String senha;
	
	@Column(unique = false, nullable = false, insertable = true, updatable = true, length = 1)
	private Integer qntAcesso;
	
	@Column(unique = false, nullable = false, insertable = true, updatable = true, length = 1)
	private String habilitado;

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getUsuario() {
		return usuario;
	}

	public void setUsuario(String usuario) {
		this.usuario = usuario;
	}

	public String getSenha() {
		return senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

	public Integer getQntAcesso() {
		return qntAcesso;
	}

	public void setQntAcesso(Integer qntAcesso) {
		this.qntAcesso = qntAcesso;
	}

	public String getHabilitado() {
		return habilitado;
	}

	public void setHabilitado(String habilitado) {
		this.habilitado = habilitado;
	}
}

e mesmo assim continua o erro:

Caused by: java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to negocio.tabela.Tabela
	at servico.bd.ServicoDeConexao.getTabela(ServicoDeConexao.java:110)
	at servico.ServicoDeLogin.fazerLogin(ServicoDeLogin.java:33)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at flex.messaging.services.remoting.adapters.JavaAdapter.invoke(JavaAdapter.java:421)
	... 23 more
Eder_Peixoto

Teu problema está no escopo desse método:

public T getTabela(String sql){  
         Session session     = sfac.openSession();  
         Transaction tx      = session.beginTransaction();  
           
         T tabela;  
           
         List lista = new ArrayList();
           
         lista = session.createSQLQuery(sql).list();
           
         if(lista.size()>=1)  
             tabela = (T)lista.get(0);
         else  
             tabela = null;  
           
         tx.commit();  
           
         session.close();  
           
         return tabela;  
     }

Como está sendo disparada uma ClassCastException, é provável que esteja ocorrendo aqui:

tabela = (T)lista.get(0);

Nessa declaração você não está informando à interface List que serão armazenados apenas objetos que sejam uma instância de Tabela:

List lista = new ArrayList();

Você poderia declarar como:

List< Tabela > lista = new ArrayList< Tabela >();

Note que estou utilizando genéricos.

* Uma pergunta: o que é retornado pelo método list()?

lista = session.createSQLQuery(sql).list();

ericmaicon

rapaz...eu também estava vendo que o erro era ali agora mesmo!!

ai mudei o método:

public T getTabela(String sql)
	{
		Session	session		= sfac.openSession();
		Transaction tx 		= session.beginTransaction();
		
		List<T> lista = new ArrayList<T>();
		
		lista = session.createSQLQuery(sql).list();
		
		tx.commit();
		
		session.close();
		
		if(lista.size()>=1)
			return lista.get(0);
		else
			return null;
	}

ele está dando o castclassexception..porém creio q seja agora no retorno..ele nao reconhece a lista.get(0) como um T..:S

creio eu..

o retorno é da lista é esse:

[img]http://img18.imageshack.us/img18/7620/testejv.png[/img]

inclusive no select eu até mandei um select * from para que traga todos os campos que tem no Usuario para nao ter dúvidas (pelo menos minha) de q nao seja isso o conflito!!

pois eu acredito de q se tenha todos os campos no List..ele teria q meio q ser equivalente com o Usuario..não?

Eder_Peixoto

Antes de invocar o método lista.get(0), imprima na tela a classe do objeto que está sendo armazenado (utilize o método getClass()). Com isso você saberá a classe do objeto.

Considerando o que você informou, que o método session.createSQLQuery(sql).list() retorna um ArrayList contendo apenas elementos do tipo da tua variável, então certamente retornará uma instância da classe Tabela.

ericmaicon

bom…eu andei pesquisando bastante aqui e mudei de hibernate pra spring toda a minha estrutura!!
hahaha

ai q nao adiantou nada!!
=(

minha classe ficou assim:

public T getTabela(String sql, Class classe) { return (T)jdbc.queryForObject(sql, classe); }

porém ele está dando exception:

Incorrect column count: expected 1, actual 6

=/

não consigo nem mais raciocinar direito mais!!

fritei td!!
haha

Criado 26 de setembro de 2009
Ultima resposta 27 de set. de 2009
Respostas 6
Participantes 2