Preenchimento do objeto com o session.refresh(produto);

Senhores
Estou com um problema chato durante os estudos da apostila fj28 (Desenvolvimento Ágil para a Web 2.0 com VRaptor, Hibernate e AJAX)
No capitulo do carrinho de compras, estou com um problema no session.refresh(produto); (do recarrega) o qual não me retorna os itens do produto
executo um “System.out.println” dos gets do objeto e me é retornado null em todos, exceto no id, que já vem do form.
Sendo assim, entendo que eu esteja fazendo algo errado em alguma classe: ou na Item - que contém a propriedade produto (Produto) ou na propria produto.

Versões:
vraptor-3.4.0 (spring 3.0.5)
hibernate3

Desde já agradeço
Quem puder me ajudar a continuar os estudos, segue os fontes:

Produto

package br.com.caelum.goodbuy.modelo;

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

import org.hibernate.validator.Length;
import org.hibernate.validator.Min;
import org.hibernate.validator.NotNull;


@Entity
public class Produto {

	@Id @GeneratedValue
	private Long id;
    
    @NotNull
    @Length(min=3)
    private String nome;
    
    @NotNull
    @Length(min=3)
    private String descricao;
    
    @Min(0)
    private Double preco;
    
    
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getDescricao() {
		return descricao;
	}
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
	public Double getPreco() {
		return preco;
	}
	public void setPreco(Double preco) {
		this.preco = preco;
	}

    
}

ProdutoDAO:


package br.com.caelum.goodbuy.dao;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;
import br.com.caelum.goodbuy.modelo.Produto;
import br.com.caelum.vraptor.ioc.Component;

@Component
public class ProdutoDAO
{
	private final Session session;
	public ProdutoDAO(Session session)
	{
		this.session = session;
	}
	@SuppressWarnings("unchecked")
	public List<Produto> listaTudo()
	{
		return this.session.createCriteria(Produto.class).list();
	}
	public void grava(Produto produto) 
	{
		Transaction tx = session.beginTransaction();
		session.save(produto);
		tx.commit();
	}
	public void atualiza(Produto produto)
	{
		this.session.flush();
		this.session.clear(); 
		Transaction tx = session.beginTransaction();		
		this.session.update(produto);
		tx.commit();
	}
	public void remove(Produto produto)
	{
		Transaction tx = session.beginTransaction();
		this.session.delete(produto);
		tx.commit();
		
	}
	public Produto carrega(Long id)
	{
		return (Produto)this.session.load(Produto.class, id);
	}
	public void recarrega(Produto prod) 
	{
		System.out.println("ID qu vem do form: " + prod.getId());		
		session.refresh(prod);		
		//Retornam todos null 
		System.out.println("Nome: " + prod.getNome());
		System.out.println("Desc: " + prod.getDescricao());
		System.out.println("Preco: " + prod.getPreco());
	}
}

ProdutoController

package br.com.caelum.goodbuy.controller;


import br.com.caelum.goodbuy.dao.ProdutoDAO;
import br.com.caelum.goodbuy.modelo.Carrinho;
import br.com.caelum.goodbuy.modelo.Item;
import br.com.caelum.vraptor.Delete;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;

@Resource
public class CarrinhoController {

        private final Carrinho carrinho;
        private final ProdutoDAO dao;
        private final Result result;

        public CarrinhoController(Carrinho carrinho, ProdutoDAO dao, Result result){
                this.carrinho = carrinho;
                this.dao = dao;
                this.result = result;
        }

        @Post @Path("/carrinho")
        public void adiciona(Item item){
                dao.recarrega(item.getProduto());
                carrinho.adiciona(item);

                result.redirectTo(CarrinhoController.class).visualiza();
        }

        @Get @Path("/carrinho")
        public void visualiza(){
        }

        @Delete @Path("/carrinho/{indiceItem}")
        public void remove(int indiceItem){
        	
                carrinho.remove(indiceItem);
                result.redirectTo(CarrinhoController.class).visualiza();
        }
}

Carrinho

/package br.com.caelum.goodbuy.modelo;

import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.SessionScoped;
import java.util.ArrayList;
import java.util.List;

@Component @SessionScoped
public class Carrinho {
        private List<Item> itens = new ArrayList<Item>();

        private Double total = 0.0;

        public List<Item> getItens() {
                return itens;
        }

        public void setItens(List<Item> itens) {
                this.itens = itens;
        }

        public Double getTotal() {
                return total;
        }

        public void setTotal(Double total) {
                this.total = total;
        }

        public void adiciona(Item item) {
                itens.add(item);
                //Aqui ocorre o null exception
                total += item.getProduto().getPreco() * item.getQuantidade();
        }

        public Integer getTotalDeItens(){
                return itens.size();
        }

        public void remove(int indiceItem) {
                Item removido = itens.remove(indiceItem);
                total -= removido.getQuantidade() * removido.getProduto().getPreco();
        }

}

Item

package br.com.caelum.goodbuy.modelo;

import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.SessionScoped;

@Component @SessionScoped
public class Item 
{
	private Produto produto;
	private Integer quantidade;
	
	public Produto getProduto() {
		return produto;
	}
	public void setProduto(Produto produto) {
		this.produto = produto;
	}
	public Integer getQuantidade() {
		return quantidade;
	}
	public void setQuantidade(Integer quantidade) {
		this.quantidade = quantidade;
	}
	
}

CarrinhoController

package br.com.caelum.goodbuy.controller;


import br.com.caelum.goodbuy.dao.ProdutoDAO;
import br.com.caelum.goodbuy.modelo.Carrinho;
import br.com.caelum.goodbuy.modelo.Item;
import br.com.caelum.vraptor.Delete;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;

@Resource
public class CarrinhoController {

        private final Carrinho carrinho;
        private final ProdutoDAO dao;
        private final Result result;

        public CarrinhoController(Carrinho carrinho, ProdutoDAO dao, Result result){
                this.carrinho = carrinho;
                this.dao = dao;
                this.result = result;
        }

        @Post @Path("/carrinho")
        public void adiciona(Item item){
                dao.recarrega(item.getProduto());
                carrinho.adiciona(item);

                result.redirectTo(CarrinhoController.class).visualiza();
        }

        @Get @Path("/carrinho")
        public void visualiza(){
        }

        @Delete @Path("/carrinho/{indiceItem}")
        public void remove(int indiceItem){        	
                carrinho.remove(indiceItem);
                result.redirectTo(CarrinhoController.class).visualiza();
        }
}

Saudações Fernando,
também estou fazendo o projeto dessa apostila, na qual recomendo por ser ótima para aprendizado, no meu caso, estou atualizando conhecimento em JAVA. Já fiz a Java para Desenvolvimento WEB terminei com sucesso.

Embora sua dúvida foi postada em 2011(faz tempo), vi que não há respostas aqui, e postarei minha solução para demais usuários que passarem pelo mesmo problema poderem aproveitar.

link da apostila atualizada: http://www.caelum.com.br/apostilas/

Como estou utilizando hibernate 4.3.1, utilizei o JPA e não a nativa(session) como na apostila(EntityManagerFactory devidamente injetados no VRaptor), mas nesse caso, não fará diferença, vamos aos fatos:

-Injetei dependência na classe Item->ProdutoDao, assim eliminei o método recarrega dela e também deixamos o VRaptor controla-la:

A classe Item ficou assim:

package br.com.caelum.goodbuy.modelo;

import br.com.caelum.goodbuy.dao.ProdutoDao;
import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.SessionScoped;

@Component
@SessionScoped
public class Item {
	
	private Produto produto;
	private Integer qtde;
	private final ProdutoDao dao;
	public Item(ProdutoDao dao){
		this.dao=dao;
	}
	
	public Produto getProduto() {
		return produto;
	}
	public void setProduto(Produto produto) {
		this.produto = dao.carrega(produto.getId());
	}
	public Integer getQuantidade() {
		return qtde;
	}
	public void setQuantidade(Integer qtde) {
		this.qtde = qtde;
	}
	
}

A classe carrinho, ficou assim, embora ainda não a revisei, acredito que poderei ainda eliminar alguns métodos dela, acho que não estão sendo utilizados:
Atenção para o método adiciona, comando itens.add(item); , se esquecer isso, ocorre o sintoma que mencionou nesse problema(enfim).

package br.com.caelum.goodbuy.modelo;

import java.util.ArrayList;
import java.util.List;

import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.SessionScoped;

@Component
@SessionScoped
public class Carrinho {
	
	private List<Item> itens = new ArrayList<Item>();
	private Double total = 0.0;
	
	public List<Item> getItens() {
		return itens;
	}
	public void setItens(List<Item> itens) {
		this.itens = itens;
	}
	public Double getTotal() {
		return total;
	}
	
	public void adiciona(Item item) {
		itens.add(item);
		this.total += item.getProduto().getPreco() * item.getQuantidade();
		
	}
	// usado no header.jspf
	public Integer getTotalDeItens(){
		return itens.size();
	}

}

Por último a CarrinhoController, note que no método adiciona, não precisa do recarrega(), pois já foi feito na classe do Item:

package br.com.caelum.goodbuy.controller;

import br.com.caelum.goodbuy.modelo.Carrinho;
import br.com.caelum.goodbuy.modelo.Item;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;

@Resource
public class CarrinhoController {
	
	private final Carrinho carrinho;
	private final Result result;
	public CarrinhoController(Carrinho carrinho, Result result){
		this.carrinho=carrinho;
		this.result=result;
	}

	@Post("/carrinho")
	public void adiciona(Item item){
		carrinho.adiciona(item);
		result.redirectTo(ProdutosController.class).lista();
	}
	
	@Get("/carrinho")
	public void visualiza(){
		
	}
}

espero ter ajudado, e continuo seguindo a apostila, mas fazendo dessa forma, já consigo add itens no carrinho sem problemas…

boa sorte a todos…