2
respostas

Como atualizar um objeto usando entity manager

Estou criando uma função editar com o codigo abaixo, mas nao está dando certo

ProdutoDao

public void atualiza(Produto produto) {
      em.getTransaction().begin();
      em.merge(produto);
      em.getTransaction().commit();
    }

ProdutoController

@Post
    public void altera(@Valid Produto produto) {
        validator.onErrorForwardTo(this).inicio();
        dao.atualiza(produto);
        result.include("message", "PRODUTO ALTERADO");
        result.redirectTo(this).lista();
     }

Editar.jsp

<form action="<c:url value='/produto/altera'/>" method="POST">
            <input type="hidden" name="produto.id" value="${produto.id}"/>
            <div class="col s6">
                NOME: <input type="text" name="produto.nome" value="${produto.nome}"/>
            </div>
            <div class="col s6">
                DESCRIÇÃO: <input type="text" name="produto.descricao" value="${produto.descricao}"/>
            </div>
            <div class="col s4">
                QUANTIDADE: <input type="number" name="produto.quanitdade" value="${produto.quantidade}"/>
            </div>
            <div class="col s4">
                VALOR: <input type="number" name="produto.valor" value="${produto.valor}"/>
            </div>
            <div class="col s4">
                VALOR DO FRETE: <input type="number" name="produto.valorFrete" value="${produto.valorFrete}"/>
            </div>
            <div class="col s9"></div>
            <div class="col s3 right">
                <input type="submit" class="btn waves-effect waves-light btn-large right" value="SALVAR"></input>    
            </div>
        </form>
2 respostas

Olá Leonardo,

o método editar no ProdutoController manda um produto para a view? Como no input do id você tem que passar um value dizendo qual o id do produto:

<input type="hidden" name="produto.id" value="${produto.id}"/>

pode ser que a view não esteja recebendo um produto e o campo id fique vazio.

vc tem a página altera.jsp?, olha eu costumo sempre dar nome para as minhas rotas,eu acho que meu código fica bem mais simples

@Post("/produto/altera")
    public void altera(@Valid Produto produto) {

System.out.println("passei aqui");
System.out.println(produto.getNome());

//se imprimiu as duas linhas acima então
//o problema é na injeção do dao ou no próprio dao
        validator.onErrorForwardTo(this).inicio();
        dao.atualiza(produto);
        result.include("message", "PRODUTO ALTERADO");
        result.redirectTo(this).lista();
     }