2
respostas

A tabela produto_precos continua vazia, foi criada, mas o livro é inserido sem os preços

@Embeddable
public class Preco {

    private BigDecimal valor;
    private TipoPreco tipo;
 //Get e Set
}

@Entity
public class Produto {

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

    @ElementCollection
    private List<Preco> precos;
// Get e Set
}
public enum TipoPreco {
    EBOOK, IMPRESSO, COMBO;
}
        <div>
            <label>Preço</label>
            <c:forEach items="${tipos}" var="tipoPreco" varStatus="status">
                <div>
                    <label>${tipoPreco}</label> 
                    <input type="text" name="preco[${status.index}].valor" />                        
                    <input type="hidden" name="preco[${status.index}].tipo" value="${tipoPreco}" />
                </div>
            </c:forEach>
        </div>
@Controller
public class ProdutosController {

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

        return modelAndView;
    }
// outro método
}
INFO: Starting ProtocolHandler ["http-nio-8081"]
set 15, 2020 9:48:05 AM org.apache.catalina.startup.Catalina start
INFO: Server startup in [17659] milliseconds
Produto [titulo=O preço não tinha ido, apesar da tabela , descricao=Criou a tabela, mas não enviou preços.

Vamos ver se funciona, paginas=25]
Hibernate: insert into Produto (descricao, paginas, titulo) values (?, ?, ?)

O vídeo do professor não incluía os valores nos campos ocultos, eu tinha incluído e não tinha funcionado. Achei um absurdo funcionar sem, mas como coisas estranhas acontecem, retirei e coloquei igual ao instrutor, não funcionou novamente. Olhei o código abaixo do vídeo e vi que lá ele estava incluído, recoloquei e teste. Não fez o insert pela terceira vez.

A tabela está no banco, mas continua vazia. Script gerado pelo PHP MyAdmin da tabela:

CREATE TABLE `produto_precos` (
  `Produto_id` bigint(20) NOT NULL,
  `tipo` int(11) DEFAULT NULL,
  `valor` decimal(19,2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Podem me ajudar a identificar o problema?

2 respostas

Olá Alexandre, tudo bem?

Provavelmente o problema está aqui:

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

Estamos mapeando sempre com base nos atributos da nossa classe, e no caso:

    private List<Preco> precos;

O atributo é precos, então nos inputs também precisamos adicionar o s para que o spring identifique de que atributo se trata:

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

Conseguiu Compreender?

Abraços :)

Muito obrigado

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