Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

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