Problema com VRaptor edita nao esta funcionando [RESOLVIDO]

16 respostas
jeanton

E ai pessoal, estou acompanahando a apostila FJ28 da caelum e estou na parte de alteração e remoção dos dados. O remove ja esta funcionando sem maiores problemas, mas o edita nao esta funcionando, abre a tela de ediçao, mas quando executa o submit da o seguinte erro

Isso na pagina web. Me parece que o erro esta exatamente no commit() pois no console aparece o sql do update e tb coloquei um SySo para emitir uma mensagem e a mensagem antes do update;

16 Respostas

Lucas_Cavalcanti

vc verificou que tá salvando mesmo no banco?
vc tá passando um id que existe?

jeanton

Não esta salvando no banco nao. e o id existe pois uso uma lista q busto direto do banco usando criteria do hibernate.

Lucas_Cavalcanti

qual código você está usando pra buscar do banco e pra editar?

jeanton

ProdutoDao

package br.com.jean.banco;

import java.util.List;

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

import br.com.caelum.vraptor.ioc.Component;
import br.com.jean.cadastros.Produto;

@Component
public class ProdutoDao {

	private final Session session;

	public ProdutoDao() {
		this.session = CriadorDeSession.getSession();
	}

	public void salva(Produto produto) {
		Transaction tx = this.session.beginTransaction();
		this.session.save(produto);
		tx.commit();
	}

	@SuppressWarnings("unchecked")
	public List<Produto> listaTudo() {
		return this.session.createCriteria(Produto.class).list();
	}

	public Produto carrega(Long id) {
		return (Produto) this.session.load(Produto.class, id);
	}

	public void atualiza(Produto produto) {
		Transaction tx = this.session.beginTransaction();
		this.session.update(produto);
		tx.commit();
	}

	public void remove(Produto produto) {
		Transaction tx = this.session.beginTransaction();
		this.session.delete(produto);
		
		tx.commit();
	}
}

Controller

package br.com.jean.controller;

import java.util.List;

import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.jean.banco.ProdutoDao;
import br.com.jean.cadastros.Produto;

@Resource
public class ProdutosController {

	private final ProdutoDao dao;
	private final Result result;

	public ProdutosController(ProdutoDao dao, Result result) {
		this.dao = dao;
		this.result = result;
	}

	public List<Produto> lista() {
		return dao.listaTudo();
	}

	public void adiciona(Produto produto) {
		dao.salva(produto);
		result.redirectTo(ProdutosController.class).lista();
	}

	public Produto edita(Long id) {
		return dao.carrega(id);
	}

	public void altera(Produto produto) {
		dao.atualiza(produto);
		result.redirectTo(ProdutosController.class).lista();
	}

	public void remove(Long id) {
		Produto produto = dao.carrega(id);
		dao.remove(produto);
		result.redirectTo(ProdutosController.class).lista();
	}

	public void formulario() {

	}

}

edita.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
	pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Altera Produto</title>
</head>
<body>
	<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>
</body>
</html>
jeanton
Lucas Cavalcanti:
qual código você está usando pra buscar do banco e pra editar?

Viu ai? O q pode estar errado, pois ja olhei e olhei umas varias vezes se digitei algo errado. o remove e o grava funcionam tranquilamente, ja o edita nao. segue a configuraçao do hibernate.cfg.xml tb.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">root</property>
		<property name="hibernate.connection.url">jdbc:mysql://localhost/teste</property>
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		
		<property name="hibernate.hbm2ddl.auto">update</property>
		
		<property name="show_sql">true</property>
		<property name="format_sql">true</property>
		
		<mapping class="br.com.jean.cadastros.Produto"/>
	</session-factory>
</hibernate-configuration>
thiagotn

A action do seu form não seria? <form action="<c:url value="/produtos/altera"/>">

jeanton

So mais uma coizinha, fiz um teste criando uma classe teste com metodo main para testar o metodo atualiza e funcino tranquilamente. Tem haver mesmo com a configuraçao do VRaptor creio eu… Agradeço a ajuda ai.

jeanton

Fiz esta alteraçao mas continua dando o mesmo erro. Mas segundo a apostila do FJ28 da caelum nao precisa colocar a url, pois na verdade nem criei ela faço um redirect dentro do metodo altera

public void altera(Produto produto) { dao.atualiza(produto); result.redirectTo(ProdutosController.class).lista(); }

mas em todo caso fiz a alteraçao e mesmo assim continua o mesmo erro.

jeanton

Descobri qual o problema, mas nao sei como resolver, na hora que executa o submit da tela edita.jsp q aciona o altera nao esta enviando o objeto. e ai tenta mesmo executar um update e nesse momento esta com id=0. Qual pode ser o problema na configuraçao do edita.jsp ou VRaptor?

Lucas_Cavalcanti

no teste do main vc tá carregando antes de atualizar?
se sim, não faça isso, popule o objeto na mão, passando o id e ve se ele altera…

jeanton

Foi exatamente o que eu fiz. no teste do main. mas pelo Browser, o id estavindo para regra com valor 0. na hora de carregar a tela do edita ele vem certo com o id correto, e quando clico no submit na url aparece na parte produto.id o valor do ad certo, só no objeto q o valor do id esta com zero, ja os outros valores como descricao, preco todos estao corretamente carregados com seus valores. Só mesmo o bendito do id q nao traz valores.

Guilherme_Moreira

Jean, como está sua classe Produto? Por favor, poste o código para darmos uma olhada.

jeanton
Guilherme Moreira:
Jean, como está sua classe Produto? Por favor, poste o código para darmos uma olhada.

Valeu guilerme por estar me ajudando segue o cod.

package br.com.jean.cadastros;

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

@Entity
public class Produto {
	@Id 
	@GeneratedValue
	private long id;
	private String nome;
	private String descricao;
	private double preco;
	
	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;
	}
	public long getId() {
		return id;
	}

}
Guilherme_Moreira

Acho que o erro está na falta de um setId

public void setId(long id){
    this.id = id;
}

Veja se isso já resolve.

abraços

Lucas_Cavalcanti

só uma dica: não use long nem double nas suas classes do hibernate (nenhum primitivo)… use Long, Double, etc pois eles podem ser nulls

jeanton

Valeu guilherme, era isso mesmo. sem o setid o vraptor nao carregava o atributo id. Obragado mesmo.

Criado 22 de março de 2010
Ultima resposta 23 de mar. de 2010
Respostas 16
Participantes 4