JTable + ArrayList + Hibernate

5 respostas
D

Olá galera, estou com um problema que está tirando meu sono.

Eu estou criando um sisteminha desktop com swing bem simples de cadastro de Banda e CD.

Estou usando o Hibernate pra persistir os dados.

Eu obtenho um ArrayList através do método listarBandas() da minha classe bandaDAO onde consta os dados de todos as Bandas cadastras no BD, mas não consigo popular o JTable.

Um detalhe é que seguindo o artigo aqui do GUJ onde ensina a utilizar o TableModel com JDBC o código funciona, agora com o Hibernate dá o seguinte erro:

Exception in thread “AWT-EventQueue-0” java.lang.ClassCastException: modelo.Banda cannot be cast to java.util.ArrayList
at controle.TableModel.getValueAt(TableModel.java:72)

Onde a linha 72 é: String [] linha = (String [])getLinhas().get(rowIndex);

Vamos ao código:

Form que contém o JTable

package visao;

imports....

public class FormListaBanda extends JFrame {
	public FormListaBanda() {
		initComponents();
	}
	
	public static JScrollPane createJTable() { 
		
		 
		BandaDAO bandaDAO = new BandaDAO();
		
		ArrayList dados;
		
		dados = bandaDAO.listarBandas();
		
		String[] colunas = {"Cod", "Nome"};
		
		TableModel modelo = new TableModel(dados, colunas);
		
		JTable jtable = new JTable(modelo);
		
		JScrollPane scrollPane = new JScrollPane(jtable);
		
		jtable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

		return scrollPane;

}

private void initComponents() {

Container contentPane = getContentPane();

getContentPane().add(FormListaBanda.createJTable(), BorderLayout.CENTER);;
		setSize(500, 150);
	    setVisible(true);


   GroupLayout.......

}

}

Classe TableModel

package controle;

import java.util.ArrayList;

import javax.swing.table.AbstractTableModel;

import modelo.Banda;

public class TableModel extends AbstractTableModel{

	private ArrayList linhas = null;
	private String [] colunas = null;
	
	public String[] getColunas() 
	{
		return colunas;
	}
	
	public ArrayList getLinhas() 
	{
		return linhas;
	}
	
	public void setColunas(String[] strings) 
	{
		colunas = strings;
	}
	
	public void setLinhas(ArrayList list) 
	{
		linhas = list;
	}
	
	public TableModel(ArrayList dados, String[] colunas){
		setLinhas(dados);
		setColunas(colunas);
		
	}

	/**
	 * Retorna o numero de colunas no modelo
	 * @see javax.swing.table.TableModel#getColumnCount()
	 */
	public int getColumnCount() 
	{
		return getColunas().length;
	}

	/**
	 * Retorna o numero de linhas existentes no modelo
	 * @see javax.swing.table.TableModel#getRowCount()
	 */
	public int getRowCount() 
	{
		return getLinhas().size();
	}

	
	public String getColumnName(int col) {
		return colunas[col];
	}
	
	/**
	 * Obtem o valor na linha e coluna
	 * @see javax.swing.table.TableModel#getValueAt(int, int)
	 */
	  
	public Object getValueAt(int rowIndex, int columnIndex) 
	   {

		// Obtem a linha, que é uma String []
		String [] linha = (String [])getLinhas().get(rowIndex);	
		
		// Retorna o objeto que esta na coluna
		return linha[columnIndex];
	
		
		}
		
	
}

BandaDAO

package modelo;

import java.util.ArrayList;

import org.hibernate.HibernateException;
import org.hibernate.ObjectNotFoundException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

public class BandaDAO {

	private Session sessao;
	
	public BandaDAO() {
		super();
		try {
			sessao = HibernateUtil.getSessionFactory().openSession();
		} catch (HibernateException e) {
			e.printStackTrace();
		}
	}
	
	public void salvarBanda(Banda banda) throws HibernateException {

		Transaction trans = this.sessao.beginTransaction();
		try {
			this.sessao.save(banda);
			trans.commit();
		} catch (Exception e) {
			trans.rollback();
			e.printStackTrace();
		}
	}
	
	public Banda obterBanda(int id) {
		Banda retorno = null;

		try {
			retorno = (Banda) this.sessao.load(Banda.class, id);
		} catch (ObjectNotFoundException e) {
			return null;
		} catch (Exception e) {
			e.printStackTrace();
		}

		return retorno;
	}


	public void alterarBanda(Banda banda) throws HibernateException {

		Transaction trans = this.sessao.beginTransaction();
		try {
			this.sessao.update(banda);
			trans.commit();
		} catch (Exception e) {
			trans.rollback();
			e.printStackTrace();
		}
	}

	public void removerBanda(Banda ba) throws HibernateException {

		Transaction trans = this.sessao.beginTransaction();
		try {
			this.sessao.delete(ba);
			trans.commit();
		} catch (Exception e) {
			trans.rollback();
			e.printStackTrace();
		}
	}

	public ArrayList<Banda> listarBandas() {
		ArrayList<Banda> lista = null;

		try {
			Query q = this.sessao.createQuery(" from Banda ");
			lista = (ArrayList<Banda>) q.list();
		} catch (ObjectNotFoundException e) {
			return null;
		} catch (Exception e) {
			e.printStackTrace();
		}

		return lista;
	}
}

Classe Banda

package modelo;

public class Banda {
	
	private Integer codigo;	
	private String nome;
	
	public Banda(Integer codigo, String nome) {
	
		this.codigo = codigo;		
		this.nome = nome;
			
	}
	

	public Banda() {
		
	}

       gets e sets.....

Mapeamento da classe Banda

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
	"-//Hibernate/Hibernate Mapping DTD//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >

<hibernate-mapping>
	<class lazy="false" name="modelo.Banda" table="public.banda">
		
		<!--		
		<id	column="id" name="codigo" type="integer" >
       		<generator class="assigned"></generator>
	   	</id>	   
	   	-->
	   
	    <id name="codigo" column="id" type="integer" length="4">  
         	<generator class="increment"></generator>  
        </id>
		
		<property column="nome" name="nome" type="string" />
	
	</class>
</hibernate-mapping>

Acredito que meu problema está no método getValueAt(int rowIndex, int columnIndex) da classe TableModel.

Já tentei de tudo e não tive sucesso. Sou novo em Java, meu conhecimento é acadêmico. Espero que possam me dar uma dica.

Valeu!

5 Respostas

B

Muda de ArrayList pra List em todo lugar q vc tá declarando a lista de bandas, e na linha 72 pq vc tá fazendo um cast pra String[]? Se é um arraylist de objetos Banda, então vc teria que fazer:

Daí de posse do objeto banda vc pode retornar a propriedade que vc quer usando ifs ou um switch, tipo:

if (columnIndex == 0) { return banda.getCodigo(); } else if (columnIndex == 1) { return banda.getNome(); }
Vc pode também generalizar o List de bandas dentro do model pra não ter que fazer o cast…
Acho que é isso, testae e diz se funcionou! \o/

D

Bruno, muito obrigado, funcionou!

Gostaria de saber o por que de se utilizar o List ao invés do ArrayList neste caso.

Valeu!

B

É pq sempre que possível é melhor usar uma interface genérica do que acoplar seu código com uma implementação dessa interface, aí se algum dia vc quiser usar alguma implementação de List que tenha caracteristicas diferentes da ArrayList que beneficie seu código, vc não vai ter que sair mudando na aplicação toda… foi só uma sugestão de design mesmo!

Era pra eu ter explicado ontem mas eh que eu tava naquela depressão dominical (passando fantástico, segunda feira chegando), aí respondi com pressa hehe!

Falowz

M

Por que usar List invés de uma implementação direta

Olhe no post do ViniGodoy.

D

Galera, muito obrigado pelas dicas!

Valeu mesmo!

Criado 14 de junho de 2009
Ultima resposta 15 de jun. de 2009
Respostas 5
Participantes 3