Apostila loja virtual Caelum lista vazia

11 respostas
R
Caros boa noite.

Estou fazendo a loja virtual da Caelum (eclipse+postgreSQL).

Para adicionar não  problemas, utilizando <a href="http://localhost:8080/loja/usuario.formulario.logic">http://localhost:8080/loja/usuario.formulario.logic</a> ( fiz a alteração @GeneratedValue(strategy = GenerationType.SEQUENCE) );

Sempre que peço a lista de usuarios ou cd, ela retorna vazia;

Alterei o TestaUsuario para verificar o retorna da lista e para minha surpresa ela aparece populada;

Esse código da lojavirtual necessita de mais alguma alteração para que funcione no PostgreeSQL.]

Alguem  teve esse problema ?

Muito obrigado
public class TestaUsuario { 
public static void main(String[] args) { 

Dao<Usuario> dao = new DaoFactory().getUsuarioDao(); 

Usuario u = new Usuario(); 
u.setLogin("user3"); 
u.setSenha("user3"); 

dao.adiciona(u);


		// lista usuarios
		List<Usuario> listausu = dao.listaTudo();
		for (Usuario usuario : listausu) {
		System.out.println(usuario.getId()+"-"+usuario.getLogin()+"-"+usuario.getSenha());
		}
		Dao<Cd> daocd = new DaoFactory().getCdDao();
		// lista cd
		List<Cd> listacd = daocd.listaTudo();
		for (Cd cd : listacd) {
		System.out.println(cd.getId()+"-"+cd.getArtista()+"-"+cd.getTitulo());
		}
	}

}

11 Respostas

Adolfo_Rodrigues

Você abriu a transação e comitou? Os métodos devem estar no seu daoFactory.
Tente algo do tipo:

Usuario u = new Usuario();   
u.setLogin("user3");   
u.setSenha("user3");   

DaoFactory daoFactory = new DaoFactory;
Dao&lt;Usuario&gt; dao = daoFactory.getUsuarioDao();

daoFactory.beginTransaction();  
dao.adiciona(u);  
daoFactory.commit();
R

Caro Adolfo, segue o DaoFactory, mas insisto em dizer que o meu problema é lista vazia e não na inserção de dados.
o teste que citei na TesteUsuario era apenas para ver até aonde a lista chega populada.
Estou fazendo o lojavirtual seguindo apostila da Caelum, a única diferença é o PostgreeSQL.
um forte abraço
agradeço a sua atenção.

package br.com.caelum.lojavirtual.dao;

import org.hibernate.Session;
import org.hibernate.Transaction;
import br.com.caelum.lojavirtual.modelo.Cd;
import br.com.caelum.lojavirtual.modelo.Musica;
import br.com.caelum.lojavirtual.modelo.Usuario;
import br.com.caelum.lojavirtual.util.HibernateUtil;


public class DaoFactory {
  private final Session session;
  private Transaction transaction;
  
  public DaoFactory(){
	  session =HibernateUtil.getSession();
  }
  public void beginTransaction() {
	  this.transaction = this.session.beginTransaction();
	  }
	  public void commit() {
	  this.transaction.commit();
	  this.transaction = null;
	  }
	  public boolean hasTransaction() {
	  return this.transaction != null;
	  }
	  public void rollback() {
	  this.transaction.rollback();
	  this.transaction = null;
	  }
	  public void close() {
	  this.session.close();
	  }
	  public Dao<Usuario> getUsuarioDao() {
	  return new Dao<Usuario>(this.session, Usuario.class);
	  }
	  
	  public Dao<Cd> getCdDao() {
      return new Dao<Cd>(this.session, Cd.class);
	  }
	  public Dao<Musica> getMusicaDao() {
	  return new Dao<Musica>(this.session, Musica.class);
	  }
}
Guilherme_Silveira

Apos adicionar, voce fez um select no banco de dados para garantir que o insert foi feito com sucesso?

Alguns drivers/bancos requerem que voce use transacoes e ignoram silenciosamente se voce nao usar.

R

Guilherme Silveira:
Apos adicionar, voce fez um select no banco de dados para garantir que o insert foi feito com sucesso?

Alguns drivers/bancos requerem que voce use transacoes e ignoram silenciosamente se voce nao usar.

Caro Guilherme bom dia.
Eu entrei no postgree e vejo os dados inseridos via formulario.
Quando rodo a testausuario (do jeito que alterei, eu consigo ver os dados na console do eclipse).
Existe algum outro teste para poder verificar até onde essa lista chega populada ?
Poderia ser o encerramento da sessão prematuro da sessão ?
Muito obrigado pela ajuda.
Essa apostila é 10!!

Guilherme_Silveira

Podemos ver sua logica e jsp? Nao saberia dizer mesmo…

R

enviarei hj a noite, pois estou no trabalho, longe do meu PC.
Pretendo utilizar esses conceitos nos próximos projetos.
Muito obrigado

Adolfo_Rodrigues

Então, Roger, acho que é isso mesmo. Você inseriu o registro pelo dao mas fora de uma transação.
Tente, ao menos, fazer da forma que eu te falei:

public class TestaUsuario {   
    public static void main(String[] args) {
        Usuario u = new Usuario();     
        u.setLogin("user3");     
        u.setSenha("user3");     
  
        DaoFactory daoFactory = new DaoFactory;  
        Dao&lt;Usuario&gt; dao = daoFactory.getUsuarioDao();  
  
        daoFactory.beginTransaction();    
        dao.adiciona(u);    
        daoFactory.commit();

        List&lt;Usuario&gt; listausu = dao.listaTudo();  
        for (Usuario usuario : listausu) {  
            System.out.println(usuario.getId()+"-"+usuario.getLogin()+"-"+usuario.getSenha());  
        }
    }
}

Se você tentar colocar o dao.adiciona() dentro da transação e mesmo assim não funcionar, aí sim pode haver algum problema.

Adolfo_Rodrigues

Guilherme, ele tá rodando o código dentro de um método main.

R

Caros, bom dia.
Só alterei a TestaUsuario para verificar até onde a lista estava sendo populada e se estava sendo populada.
Estou fazendo a loja conforme as intruções da apostila, segue abaixo :

lista.ok.jsp

<%@page pageEncoding="Cp1252" contentType="text/html; charset=Cp1252" %>
<%@ taglib uri="http://displaytag.sf.net" prefix="display" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Cp1252"/>
<title></title>
</head>
<body>
<h1>Usuários</h1>
<display:table id="usuario" name="${usuarios}" requestURI="usuario.lista.logic">
<display:column property="id" sortable="true"/>
<display:column property="login" />
</display:table>
</body>
</html>

UsuarioLogic.java

package br.com.caelum.lojavirtual.logic;
import java.util.List;
import org.vraptor.annotations.Component;
import org.vraptor.annotations.InterceptedBy;
import br.com.caelum.lojavirtual.dao.DaoFactory;
import br.com.caelum.lojavirtual.modelo.Usuario;

@Component
@InterceptedBy(DaoInterceptor.class)
public class UsuarioLogic {

private final DaoFactory daoFactory;
public UsuarioLogic(DaoFactory daoFactory) {
	this.daoFactory = daoFactory;
}
public void formulario(){
	
}
public void adiciona (Usuario usuario) {
this.daoFactory.beginTransaction();
this.daoFactory.getUsuarioDao().adiciona(usuario);
this.daoFactory.commit();
System.out.println("Adicionando " + usuario + " no banco de dados!");
}
 private List<Usuario> usuarios;
 public void lista () {
 usuarios = this.daoFactory.getUsuarioDao().listaTudo();
}
 
public List<Usuario> getUsuarios() {
return usuarios;
}
public void remove (Usuario usuario) {
	this.daoFactory.beginTransaction();
	this.daoFactory.getUsuarioDao().remove(usuario);
	this.daoFactory.commit();
	}
}

DaoInterceptor.java

package br.com.caelum.lojavirtual.logic; 

import org.vraptor.Interceptor; 
import org.vraptor.LogicException; 
import org.vraptor.LogicFlow; 
import org.vraptor.annotations.Out; 
import org.vraptor.view.ViewException; 
import br.com.caelum.lojavirtual.dao.DaoFactory; 

public class DaoInterceptor implements Interceptor { 

private final DaoFactory factory = new DaoFactory(); 
@Out(key="br.com.caelum.lojavirtual.dao.DaoFactory") 
public DaoFactory getFactory() { 
return factory; 
} 
public void intercept(LogicFlow flow) throws LogicException, ViewException { 
flow.execute(); 
if (factory.hasTransaction()) { 
factory.rollback(); 
} 
factory.close(); 
} 
}

Dao.java

package br.com.caelum.lojavirtual.dao; 

import java.util.List; 
import org.hibernate.Session; 

public class Dao<T> { 
private final Session session; 
private final Class type; 

public Dao(Session session, Class type) { 
this.session = session; 
this.type = type; 
} 

protected Session getSession() { 
return session; 
} 

public void adiciona(T usuario) { 
this.session.save(usuario); 
} 

public void atualiza(T usuario) { 
this.session.merge(usuario); 
}

Usuario.java

package br.com.caelum.lojavirtual.modelo;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;


@Entity
public class Usuario {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
	private Long id;
	private String login;
	private String senha;

	public final Long getId() {
		return id;
	}
	public final void setId(Long id) {
		this.id = id;
	}
	public final String getLogin() {
		return login;
	}
	public final void setLogin(String login) {
		this.login = login;
	}
	public final String getSenha() {
		return senha;
	}
	public final void setSenha(String senha) {
		this.senha = senha;
	}
	
}

Ao digitar o caminho no navegador http://localhost:8080/loja/usuario.lista.logic
eu obtenho uma lista vazia.

Usuários
Nothing found to display.

Lembrando, uso Eclipse+PostgreSQL e estou conseguindo adicionar sem problemas pelo endereço http://localhost:8080/loja/usuario.formulario.logic
Muito obrigado

R

Bom dia Amigos, esse é o log da Console do Eclipse, mostrando o inicio do tomcat e a solicitação da URL no IE7 http://localhost:8080/loja/usuario.lista.logic.
Estou para começar um novo projeto e preciso me decidir se seguirei a metodologia ensinada na apostila da Caelum e ou se
utilizo hibernate com aquele monte de configuração em XML.
abraços.
Agradeço a ajuda de todos.

R

Caros, bom dia.
Consegui resolver o problema, deletei o conteúdo de work (usuario,cd, musica) e também deletei as listas criadas dentro da pasta web, refiz as listas (conforme a apostila) e as mesmas estão sendo populadas sem problemas.
Gostaria de agradecer o empenho de todos. Muito obrigado

Criado 31 de janeiro de 2008
Ultima resposta 6 de fev. de 2008
Respostas 11
Participantes 3