Problemas com listagem vazia

15 respostas
anderson.bonavides

Pessoal, desculpem o novo post mas é que não sei mais pra onde ir com meu problema de datatable vazio.
Tenho 4 inserções no banco de dados e quando eu tento listar com o datatable ele mostra as 4 linhas vazias. Mas se por acaso eu inserir e imediatamente mandar listar ele mostra a listagem mas substituindo todas as linhas anteriores.

Obs: Estou utilizando: JSF(facalets + myFaces) + spring+ hibernate/jpa. Porém o hibernate não está no spring.

Segue uma imagem do meu problema:

15 Respostas

anderson.bonavides

Alguem?

Grato!

R

Cadê o código?

anderson.bonavides

Segue o código.

Meu bean:
public List<Usuario> getUsuarios() {
		try{
			usuarios = new ArrayList<Usuario>();
			usuarios = usuarioDaoImpl.listar();
		}catch(Exception e){
			System.out.println("LANCOU EXCECAO!!!");
			e.printStackTrace();
		}
		return usuarios;
	}
O método que busca do banco:
public List<T> listar() {
		List<T> objects = null;
		Session session = HibernateUtility.getSession();
		Transaction tx = session.beginTransaction();
		try {
			Query select = session.createQuery("Select u from Usuario u");
			objects = select.list();
			System.out.println("\nNAO LANCOU EXCECAO!!!");
		} catch (HibernateException he) {
			System.out.println("LANCOU EXCECAO!!!");
			he.printStackTrace();
		}finally{
			session.close();
			System.gc();
		}
		return objects;
	}
A classe utilitaria que pega a sessão:
public class HibernateUtility {

	private static SessionFactory sessionFactory;
	private static Session session;

	static {
		try {
			sessionFactory = new AnnotationConfiguration().configure(
					"/hibernate.cfg.xml").buildSessionFactory();
		} catch (Exception e) {
			sessionFactory = null;
			e.printStackTrace();
		}
	}

	public static Session getSession() {
		return session = sessionFactory.openSession();
	}
}
O xhtml que lista o usuário:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:a4j="http://richfaces.org/a4j"
	xmlns:rich="http://richfaces.org/rich">
<ui:composition template="../../template/template.xhtml">
	<ui:define name="title">
			Projeto Base - Listagem de Usuário
		</ui:define>
	<ui:define name="conteudo">
		<f:view>
			<f:subview id="listarUsuario">
				<rich:panel>
					<f:facet name="header">
						<center>Listagem de Usuários</center>
					</f:facet>
					<center><h:panelGrid columns="1">
						<h:form id="lista_usuario">
							<rich:dataTable value="#{usuarioBean.usuarios}" var="usuario"
								onRowMouseOver="this.style.backgroundColor='#F8F8F8'"
								onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'"
								rowClasses="cur">
								<rich:column>
									<f:facet name="header">Id</f:facet>
									<h:outputText value="#{usuario.id}" />
								</rich:column>
								<rich:column>
									<f:facet name="header">Nome</f:facet>
									<h:outputText value="#{usuario.nome}" />
								</rich:column>
								<rich:column>
									<f:facet name="header">Telefone</f:facet>
									<h:outputText value="#{usuario.telefone}" />
								</rich:column>
								<!-- 	
								<rich:column>				
									<f:facet name="header">Rua</f:facet>						
										<ui:repeat value="#{usuario.endereco}" var="end">																									
											<h:outputText value="#{end.rua}" />																		
										</ui:repeat>													
								</rich:column>
								<rich:column>				
									<f:facet name="header">Bairro</f:facet>						
										<ui:repeat value="#{usuario.endereco}" var="end">																									
											<h:outputText value="#{end.bairro}" />																		
										</ui:repeat>													
								</rich:column>
								-->
								<rich:column>
									<f:facet name="header">Login</f:facet>
									<h:outputText value="#{usuario.login.nomeLogin}" />
								</rich:column>
							</rich:dataTable>
						</h:form>
					</h:panelGrid></center>
				</rich:panel>
			</f:subview>
		</f:view>
	</ui:define>
</ui:composition>
</html>
fantomas

Cadê o código?

rod

Este metodo getUsuarios() esta em uma Entity ?

rod

ignore… ja vi que esta no seu managed bean.

anderson.bonavides

Você quer dizer se ele está em uma classe de dominio?

Por que se for ele não está. Ele está no managed bean.

anderson.bonavides

Eu andei procurando e acredito que seja um problema de sessão. Ele só exibe o que está na sessão. Mas não sei resolver.

R

<h:outputText value="#{usuario}" />

adicione isso numa coluna e veja o que retorna
se ele exibir o nome da classe de dominio
quer dizer que ele está trazendo do banco corretamente

senão, diga-nos o que ele mostra

enfia um breakpoint no metodo get de alguma propriedade da classe de dominio e veja o que ele mostra nas diversas vezes que passar por lá, e se uma delas está com valor

por ultimo
qual a necessidade de se fazer isso?

usuarios = new ArrayList&lt;Usuario&gt;();  
         usuarios = usuarioDaoImpl.listar();

se você vai sobrescrever o valor do objeto, não precisa instanciar um objeto vazio antes

anderson.bonavides
O Grande Bé:
<h:outputText value="#{usuario}" />

adicione isso numa coluna e veja o que retorna
se ele exibir o nome da classe de dominio
quer dizer que ele está trazendo do banco corretamente

senão, diga-nos o que ele mostra

Sim ele exibe a intancia da classe:

br.com.projetobase.modelo.Usuario@16c5f50
enfia um breakpoint no metodo get de alguma propriedade da classe de dominio e veja o que ele mostra nas diversas vezes que passar por lá, e se uma delas está com valor

Eu não sei debugar perfeitamente com maven, ele debuga mas eu não tenho como utilizar o F5 e o F6. Por enquanto estou utilizando o System.out.println();

Isso é o que mostra quando utilizo ele:

Id: 1
Nome: Anderson
Bairro: Cristo
Login: anderson
-------------------------------------------------
Id: 2
Nome: Anderson
Bairro: Cristo
Login: anderson
-------------------------------------------------
Id: 3
Nome: Anderson
Bairro: Cristo
Login: anderson
-------------------------------------------------
Id: 4
Nome: Anderson
Bairro: Cristo
Login: anderson
-------------------------------------------------
Id: 5
Nome: Anderson
Bairro: Cristo
Login: anderson
-------------------------------------------------

Só lembrando que ainda não estou verificando se o usuário já se cadastrou, por isso a repetição do mesmo usuário mas com ID´s diferentes.

por ultimo qual a necessidade de se fazer isso?
usuarios = new ArrayList&lt;Usuario&gt;();  
         usuarios = usuarioDaoImpl.listar();
se você vai sobrescrever o valor do objeto, não precisa instanciar um objeto vazio antes
Primeiro minha variável é um List como declarado na classe:
private List&lt;Usuario&gt; usuarios;
getr´s e setr´s

Como um List é uma interface eu preciso instanciar, seja com ArrayList, LinkedList, Vector e etc...
Já a segunda linha é quem chama do método que traz do banco.

Espero ter ficado claro.

R

Anderson, pelo que você falou da saida do sysout ai
ta tudo certo até a view
o problema é que o expression language não ta conseguindo resolver as propriedades, isso é muito estranho

Só uma pergunta, ele passa algumas vezes pelo metodo get dessa classe (faz parte do ciclo de vida do JSF)
da ultima vez, ainda tem valor nos beans?

Quanto ao List

quando você faz

variavel = new ArrayList&lt;Tipo&gt;();

você faz com que a variavel aponte para um objeto vazio do tipo array list em memória, e pode acessa-lo como List

depois, quando você faz

variavel = dao.listar();

você está fazendo a variavel apontar para outro objeto criado pelo dao, ou seja
sua primeira linha, não faz sentido nenhum, quem instancia o List (indepentende do tipo) é a API do JPA

Eu posso estar falando groselha, se o JPA ou algo que você esteja utilizando de IoP seja muito sofisticado e consiga fazer isso que você imaginou, mas pra mim não faz muito sentido isso.

R

Anderson, só pra completar sobre o list, pra funcionar do jeito que vocÊ imaginou, teria que ser algo assim:

list = new ArrayList&lt;Tipo&gt;();
dao.preencher(list);

e dentro do metodo preencher, vocÊ adicionaria bean por bean no list

T

pra que voce chama System.gc(); ???

anderson.bonavides

O System.gc(); não esta fazendo muita coisa em relação ao método, mas em relação a limpeza de memória sim. Talvez ele encontre um objeto fora de uso ou talvez não.

anderson.bonavides
O Grande Bé:
Anderson, pelo que você falou da saida do sysout ai ta tudo certo até a view o problema é que o expression language não ta conseguindo resolver as propriedades, isso é muito estranho

Só uma pergunta, ele passa algumas vezes pelo metodo get dessa classe (faz parte do ciclo de vida do JSF)
da ultima vez, ainda tem valor nos beans?

Ele não passa por nenhuma vez nos métodos get´s desta classe, ou seja, do managed bean.

Meu managed bean está na seguinte forma:

public class UsuarioBean {

	private Usuario usuario;
	private Endereco endereco;
	private Login login;
	private UsuarioDAOImpl usuarioDaoImpl;
	private String resultado;
	private List<Usuario> usuarios;
	
	//getrs e setrs.
	
	
	
	
}

O erro seria isso?

Criado 25 de março de 2009
Ultima resposta 27 de mar. de 2009
Respostas 15
Participantes 5