Solucionado (ver solução)
Solucionado
(ver solução)
10
respostas

Hibernate nao esta persistindo os tipos de preços

Ao tentar cadastrar um livro o hibernate nao esta presistindo os tipos de preços,

segue o form:

<%@ 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>Livros de Java, Android, iPhone, Ruby, PHP e muito mais -
    Casa do Código</title>
</head>
<body>
    <form action="/casadocodigo/produtos" method="post">
        <div>
            <label>Titulo</label> <input type="text" name="titulo" />
        </div>

        <div>
            <label>Descrição</label>
            <textarea rows="10" cols="20" name="descricao"></textarea>
        </div>

        <div>
            <label>Paginas</label> <input type="text" name="paginas" />
        </div>


        <c:forEach items="${tipos}" var="tipoPreco" varStatus="status">
            <div>
                <label>${tipoPreco}</label> 
                <input type="text" name="precos[${status.index}].valor" />
                <input type="hidden" name="precos[${status.index}].tipo" value="${tipoPreco}" />
            </div>
        </c:forEach>

        <button type="submit">Cadastrar</button>


    </form>


</body>
</html>

segue ProdutoController:

package br.com.casadocodigo.controllers;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import br.com.casadocodigo.daos.ProdutoDao;
import br.com.casadocodigo.models.Produto;
import br.com.casadocodigo.models.TipoPreco;

@Controller
public class ProdutosController {

    @RequestMapping("/produtos/form")
    public ModelAndView produtos(){

        ModelAndView modelAndView = new ModelAndView("produtos/form");
        modelAndView.addObject("tipos", TipoPreco.values());

        return  modelAndView;        
    }


    @Autowired
    private ProdutoDao dao;

    @RequestMapping("/produtos")
    public String gravar(Produto produto){
        System.out.println(produto);
        dao.gravar(produto);
        return "/produtos/ok";
    }
}

segue o ProdutoDao:

package br.com.casadocodigo.daos;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import br.com.casadocodigo.models.Produto;


@Repository
@Transactional
public class ProdutoDao {

    @PersistenceContext
    private EntityManager manager;


    public void gravar(Produto produto){
        manager.persist(produto);
    }
}

segue o Produto:

package br.com.casadocodigo.models;

import java.util.List;

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

@Entity
public class Produto {

    @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;
    private String titulo;
    private String descricao; 
    private int paginas;

    @ElementCollection
    private List<Preco> preco;


    public List<Preco> getPreco() {
        return preco;
    }
    public void setPreco(List<Preco> preco) {
        this.preco = preco;
    }
    public Integer getId() {
        return id;
    }
    public String getTitulo() {
        return titulo;
    }
    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }
    public String getDescricao() {
        return descricao;
    }
    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }
    public int getPaginas() {
        return paginas;
    }
    public void setPaginas(int paginas) {
        this.paginas = paginas;
    }

    @Override
    public String toString() {
        return "Produto: titulo= " + titulo + ", descricao= " + descricao + ", paginas= " + paginas + "";
    }
}

ele persiste o livro sem os preços nao da erro nenhum, sai isso no console:

Produto: titulo= teste, descricao= teste, paginas= 100
Hibernate: insert into Produto (descricao, paginas, titulo) values (?, ?, ?)

se eu dou um desc Produto no terminal ele nao mostra a coluna de preco.

muito obrigado.

10 respostas

Gabriel, dá uma olhada na sua classe Preço, veja se ela está anotada como "@Embeddable".

Carlos esta sim ja havia olhado, e como se aquela opção do Hibernate de atualiza o banco automático nao estivesse funcionando, pelo menos é oq acho props.setProperty("hibernate.hbm2ddl.auto", "update"); mas esta la a linha

Se você quiser eu posso testar aqui na minha máquina, só mandar o projeto para o GitHub e me passar o link.

obrigado carlos, vou subir e ja mando o link

Carlos eu coloquei em um servidor de arquivo se puder dar uma olhada agradeço muito

https://mega.nz/#!8IsjzQLL!WQw73vGo0PQ5Ko_y1uZsQLkgaNox0eRMQf5dHYJpKMs

solução!

Gabriel, mude seu atributo da classe Produto de "preco" para "precos", apague os gets and sets correspondente a esse atribulo e gere novos.

class Produto:

@ElementCollection
private List<Preco> preco;

form:

<input type="text" name="precos[${status.index}].valor" />
<input type="hidden" name="precos[${status.index}].tipo" value="${tipoPreco}" />

Acredito que já tenha percebido o erro. O form está enviado os parâmetros dos preços no plural, porém seu atributo da classe Produto está no singular, com isso o Spring não consegue associar as classes e fazer o binding.

Carlos muito obrigado por sua atenção, mas segui suas instruções e continua igual, alterei o atributo apaguei os gets e sets mas mesmo assim ele ignora os preços :(

carlos eu reiniciei minha maquina, uma coisa estranha esta acontecendo, no console agora ele me apresenta isso:

Hibernate: insert into Produto (descricao, paginas, titulo) values (?, ?, ?) Hibernate: insert into Produto_precos (Produto_id, tipo, valor) values (?, ?, ?) Hibernate: insert into Produto_precos (Produto_id, tipo, valor) values (?, ?, ?) Hibernate: insert into Produto_precos (Produto_id, tipo, valor) values (?, ?, ?)

mas se faço um selectno banco ele retorna vazio sem dados na tabela

Veja se não tem outra tabela Produto_precos.

carlos eu verifiquei nao havia eu dropei o banco e criei de novo, muito obrigado pela ajuda.

abraço

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software