Toe!

boa tarde, vou postar minhas classes, e meu erro !

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

@Entity
public class Produto {
    private String nome;
    private String descricao;
    private Double preco;
    @Id @GeneratedValue
    private Long id;

    
    public void setPreco(Double preco) {
		this.preco = preco;
	}
	public Double getPreco() {
		return preco;
	}
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
	public String getDescricao() {
		return descricao;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getNome() {
		return nome;
	}
	
	public Long getId() {
		return id;
	}

}
import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;

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

@Component//pode ser instanciada pelo vraptor sempre q for preciso
public class ProdutoDAO {

	private final Session session;
	
	public ProdutoDAO(){
		session=CriadorDeSessao.getSession();
	}
	
	public void salva(Produto produto) {
		Session session = CriadorDeSessao.getSession();
		Transaction tx = session.beginTransaction();
	     session.save(produto);
	     tx.commit();
	}
	public List<Produto> listaTudo() {
	    return this.session.createCriteria(Produto.class).list();
	    //criteria-->temos acesso a diversas operações no banco de dados
	}
	public Produto carrega(Long id) {
	    return (Produto) session.load(Produto.class, id);
	}
	public void atualiza(Produto produto) {
		Transaction tx = session.beginTransaction();
		this.session.update(produto);
		tx.commit();
	}
	public void remove(Produto produto) {
	    session.delete(produto);
	}
	public void recarrega(Produto produto) {
	    session.refresh(produto);
	}



}
import java.util.List;

import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;

@Resource
public class ProdutoController {
	private Result i;
	
	public List<Produto> lista() {
	    ProdutoDAO dao = new ProdutoDAO();
	    return dao.listaTudo();
	    //esta faendo a chamada do metodo listatudo() criado na classe ProdutoDAO
	}
	private final ProdutoDAO dao;
	public ProdutoController(ProdutoDAO dao, Result i){//construtor q recebe uma instancia de PRODUTO
		this.dao=dao;
		this.i=i;
		
	}
	public void adiciona(Produto produto) {
	    ProdutoDAO dao = new ProdutoDAO();
	    dao.salva(produto);
	    i.redirectTo(this).lista();//this=ProdutoController.class para ocorrer 
	    //outra requisicao na URL,previnindo q o usuario re-envie o formulario
	}
	public void formulario() {
	}

	public Produto edita(Long id){
	    ProdutoDAO dao = new ProdutoDAO();
	    return dao.carrega(id);
	}
	
	public void altera(Produto produto) {
		ProdutoDAO dao = new ProdutoDAO();
	    dao.atualiza(produto);
	    i.redirectTo(this).lista();//redirecionar para minha jsp lista 
	}
	public void remove(Long id) {
		ProdutoDAO dao = new ProdutoDAO();
	    Produto produto = dao.carrega(id);
	    dao.remove(produto);
	    i.redirectTo(this).lista();
	}

	
}

E minha jsp

<form action="altera">
    <fieldset>
        <legend>Editar Produto</legend>
        <input type="hidden" name="produto.id" value="${produto.id }" />
        <label for="nome">Nome:</label>
        <input id="nome" type="text" name="produto.nome" value="${produto.nome }"/>
        <label for="descricao">Descrição:</label>
        <textarea id="descricao" name="produto.descricao">${produto.descricao }</textarea>
        <label for="preco">Preço:</label>
        <input id="preco" type="text" name="produto.preco" value="${produto.preco }"/>
        <button type="submit">Enviar</button>
    </fieldset>
</form>

Erro que ocorre : br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: org.hibernate.TransientObjectException: The given object has a null identifier: Produto

veja se está sendo impresso algo no valor de produto.id. Troque nessa linha abaixo o type=hidden para type=text.

,

Matei meu problema, n possuia o metodo setId()