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

Erro ao tentar salvar um registro com tabelas relacionadas

Bom dia pessoal!

Está gerando erro ao tentar salvar um registro, as tabelas estão relacionadas. Mostra erro, de que o campo não existe na tabela "Mãe", o campo está em uma das tabelas "Filhas". Esse campo está ligado por um "select" no jsp, os campos que estão ligados com inputs não estão gerando problema.

Erro:

HTTP Status 500 - /WEB-INF/jsp/produto/listaVaz.jsp raised an exception

type Exception report

message /WEB-INF/jsp/produto/listaVaz.jsp raised an exception

description The server encountered an internal error that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: /WEB-INF/jsp/produto/listaVaz.jsp raised an exception
    br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:127)
root cause

org.apache.jasper.JasperException: javax.el.PropertyNotFoundException: Property 'montadora' not found on type br.com.ebf.modelo.Produto
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:565)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:481)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

Meu form.jsp:

<div class="col-md-2">
        <label>Montadora:</label>
        <select name="produtoVaz.montadora" class="form-control">
            <c:forEach items="${montadoras}" var="montadora">
                            <option value="${montadora.nome}" ${produtoVaz.montadora eq montadora.nome ? "SELECTED" : ""}>${montadora.nome}</option>
                        </c:forEach>
        </select>            
</div>
6 respostas

esse erro ai parece que está mais fácil identificar, posta ai tua Classe Produto Vaz e Montadora completas

A classe Montadora, é somente pra eu ter flexibilidade dos dados e não "chumbar" as informações no select...

O relacionamento está em Produto => ProdutoVaz

E o atributo "montadora" está na classe ProdutoVaz...

Classe Produto:

package br.com.ebf.modelo;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import org.hibernate.validator.constraints.NotEmpty;

@Entity
@Table(name = "TAB_PROD_DT")
public class Produto {

    // ATRIBUTOS "COMUNS" PARA TODOS OS PRODUTOS:
    @Id
    @Column(length = 10)
    @GeneratedValue(strategy = GenerationType.IDENTITY) // MYSQL
    private Integer id;

    @NotEmpty
    @Column(name = "codigo_produto", length = 24)
    private String codigoProduto;

    @Column(columnDefinition = "Character(1)")
    private Character catalogo;

    @Column(name = "descricao_tipo_produto", length = 30)
    private String descricaoTipoProduto;

    @Column(length = 19)
    private Integer ean;

    @Column(length = 30)
    private String imagem;

    @Column(name = "imagem_embalagem", length = 40)
    private String imagemEmbalagem;

    @Column(columnDefinition = "Character(1)")
    private Character lancamento;

    @Column(columnDefinition = "Character(1)")
    private Character liberado;

    @Column(name = "local_imagem", length = 200)
    private String localImagem;

    @Column(length = 30)
    private String marca;

    @Column(length = 19)
    private Integer ncm;

    @Column(columnDefinition = "Character(1)")
    private Character original;

    @Column
    private Double peso;

    @Column
    private Double preco;

    @Column(columnDefinition = "Character(1)")
    private Character promocao;

    @Column(name = "queima_estoque", columnDefinition = "Character(1)")
    private Character queimaEstoque;

    @Column(length = 60)
    private String semelhantes;

    @Column(name = "tipo_produto")
    private Integer tipoProduto;

    /******************************************************************************/

    @OneToOne(cascade = CascadeType.PERSIST)
    private ProdutoEco produtoEco;

    @OneToOne(cascade = CascadeType.PERSIST)
    private ProdutoVaz produtoVaz;

    @OneToOne(cascade = CascadeType.PERSIST)
    private ProdutoVazCap produtoVazCap;

    /******************************************************************************/

    public Integer getId() {
        return id;
    }

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

    public String getCodigoProduto() {
        return codigoProduto;
    }

    public void setCodigoProduto(String codigoProduto) {
        this.codigoProduto = codigoProduto;
    }

    public Character getCatalogo() {
        return catalogo;
    }

    public void setCatalogo(Character catalogo) {
        this.catalogo = catalogo;
    }

    public String getDescricaoTipoProduto() {
        return descricaoTipoProduto;
    }

    public void setDescricaoTipoProduto(String descricaoTipoProduto) {
        this.descricaoTipoProduto = descricaoTipoProduto;
    }

    public Integer getEan() {
        return ean;
    }

    public void setEan(Integer ean) {
        this.ean = ean;
    }

    public String getImagem() {
        return imagem;
    }

    public void setImagem(String imagem) {
        this.imagem = imagem;
    }

    public String getImagemEmbalagem() {
        return imagemEmbalagem;
    }

    public void setImagemEmbalagem(String imagemEmbalagem) {
        this.imagemEmbalagem = imagemEmbalagem;
    }

    public Character getLancamento() {
        return lancamento;
    }

    public void setLancamento(Character lancamento) {
        this.lancamento = lancamento;
    }

    public Character getLiberado() {
        return liberado;
    }

    public void setLiberado(Character liberado) {
        this.liberado = liberado;
    }

    public String getLocalImagem() {
        return localImagem;
    }

    public void setLocalImagem(String localImagem) {
        this.localImagem = localImagem;
    }

    public String getMarca() {
        return marca;
    }

    public void setMarca(String marca) {
        this.marca = marca;
    }

    public Integer getNcm() {
        return ncm;
    }

    public void setNcm(Integer ncm) {
        this.ncm = ncm;
    }

    public Character getOriginal() {
        return original;
    }

    public void setOriginal(Character original) {
        this.original = original;
    }

    public Double getPeso() {
        return peso;
    }

    public void setPeso(Double peso) {
        this.peso = peso;
    }

    public Double getPreco() {
        return preco;
    }

    public void setPreco(Double preco) {
        this.preco = preco;
    }

    public Character getPromocao() {
        return promocao;
    }

    public void setPromocao(Character promocao) {
        this.promocao = promocao;
    }

    public Character getQueimaEstoque() {
        return queimaEstoque;
    }

    public void setQueimaEstoque(Character queimaEstoque) {
        this.queimaEstoque = queimaEstoque;
    }

    public String getSemelhantes() {
        return semelhantes;
    }

    public void setSemelhantes(String semelhantes) {
        this.semelhantes = semelhantes;
    }

    public Integer getTipoProduto() {
        return tipoProduto;
    }

    public void setTipoProduto(Integer tipoProduto) {
        this.tipoProduto = tipoProduto;
    }

    public ProdutoEco getProdutoEco() {
        return produtoEco;
    }

    public void setProdutoEco(ProdutoEco produtoEco) {
        this.produtoEco = produtoEco;
    }

    public ProdutoVaz getProdutoVaz() {
        return produtoVaz;
    }

    public void setProdutoVaz(ProdutoVaz produtoVaz) {
        this.produtoVaz = produtoVaz;
    }

    public ProdutoVazCap getProdutoVazCap() {
        return produtoVazCap;
    }

    public void setProdutoVazCap(ProdutoVazCap produtoVazCap) {
        this.produtoVazCap = produtoVazCap;
    }
}

Classe ProdutoVaz:

package br.com.ebf.modelo;

import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import org.hibernate.validator.constraints.NotEmpty;

@Entity
@Table(name = "TAB_PROD_VAZ_DT")
public class ProdutoVaz {

    @Id
    @Column(length = 19)
    @GeneratedValue(strategy = GenerationType.IDENTITY) // MYSQL
    private Integer id;

    @NotEmpty
    @Column(name = "codigo_produto", length = 24)
    private String codigoProduto;

    @Column(name = "ate_ano", length = 10)
    private String ateAno;

    @Column
    private Integer cilindrada;

    @Column(name = "de_ano", length = 4)
    private String deAno;

    @Column(name = "dianteira_traseira", length = 3)
    private String dianteiraTraseira;

    @Column(length = 80)
    private String modelo;

    @Column(length = 30)
    private String montadora;

    @Column(name = "nro_dentes_elos", length = 10)
    private Integer nroDentesElos;

    @Column(name = "pinca_dupla", columnDefinition = "Character(1)")
    private Character pincaDupla;

    @Column(name = "sulfixo_opcional", length = 6)
    private String sulfixoOpcional;

    /******************************************************************************/
    @OneToOne(mappedBy = "produtoVaz")
    @JoinColumn(name = "produto_id")
    private Produto produto;

    /******************************************************************************/

    @OneToMany(cascade = CascadeType.PERSIST)
    @JoinColumn(name = "produtoVaz")
    private List<ProdutoVazKit> produtoVazKits;

    @OneToMany(cascade = CascadeType.PERSIST)
    @JoinColumn(name = "produtoVaz")
    private List<ProdutoVazPrefixo> produtoVazPrefixos;

    /******************************************************************************/

    public Integer getId() {
        return id;
    }

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

    public String getCodigoProduto() {
        return codigoProduto;
    }

    public void setCodigoProduto(String codigoProduto) {
        this.codigoProduto = codigoProduto;
    }

    public String getAteAno() {
        return ateAno;
    }

    public void setAteAno(String ateAno) {
        this.ateAno = ateAno;
    }

    public Integer getCilindrada() {
        return cilindrada;
    }

    public void setCilindrada(Integer cilindrada) {
        this.cilindrada = cilindrada;
    }

    public String getDeAno() {
        return deAno;
    }

    public void setDeAno(String deAno) {
        this.deAno = deAno;
    }

    public String getDianteiraTraseira() {
        return dianteiraTraseira;
    }

    public void setDianteiraTraseira(String dianteiraTraseira) {
        this.dianteiraTraseira = dianteiraTraseira;
    }

    public String getModelo() {
        return modelo;
    }

    public void setModelo(String modelo) {
        this.modelo = modelo;
    }

    public String getMontadora() {
        return montadora;
    }

    public void setMontadora(String montadora) {
        this.montadora = montadora;
    }

    public Integer getNroDentesElos() {
        return nroDentesElos;
    }

    public void setNroDentesElos(Integer nroDentesElos) {
        this.nroDentesElos = nroDentesElos;
    }

    public Character getPincaDupla() {
        return pincaDupla;
    }

    public void setPincaDupla(Character pincaDupla) {
        this.pincaDupla = pincaDupla;
    }

    public String getSulfixoOpcional() {
        return sulfixoOpcional;
    }

    public void setSulfixoOpcional(String sulfixoOpcional) {
        this.sulfixoOpcional = sulfixoOpcional;
    }

    public Produto getProduto() {
        return produto;
    }

    public void setProduto(Produto produto) {
        this.produto = produto;
    }

    public List<ProdutoVazKit> getProdutoVazKits() {
        return produtoVazKits;
    }

    public void setProdutoVazKits(List<ProdutoVazKit> produtoVazKits) {
        this.produtoVazKits = produtoVazKits;
    }

    public List<ProdutoVazPrefixo> getProdutoVazPrefixos() {
        return produtoVazPrefixos;
    }

    public void setProdutoVazPrefixos(List<ProdutoVazPrefixo> produtoVazPrefixos) {
        this.produtoVazPrefixos = produtoVazPrefixos;
    }
}

Classe Montadora:

package br.com.ebf.modelo;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "TAB_CATALOGO_MONTADORA")
public class Montadora {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // MYSQL
    private Integer id;

    @Column(length = 30)
    private String nome;

    @Column(length = 30)
    private String marca;

    @Column(columnDefinition = "Character(1)")
    private Character ativa;

    public Integer getId() {
        return id;
    }

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

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getMarca() {
        return marca;
    }

    public void setMarca(String marca) {
        this.marca = marca;
    }

    public Character getAtiva() {
        return ativa;
    }

    public void setAtiva(Character ativa) {
        this.ativa = ativa;
    }
}

Meu select no jsp:

<div class="col-md-2">
    <label>Montadora:</label>
    <select name="produtoVaz.montadora" class="form-control">
        <c:forEach items="${montadoras}" var="montadora">
            <option value="${montadora.nome}" ${produtoVaz.montadora eq montadora.nome ? "SELECTED" : ""}>${montadora.nome}</option>
        </c:forEach>
    </select>            
</div>
<div class="col-md-2"></div>

Oi, duas perguntas, 1-oque é esses montadoras? array de Strings, Lista de Strings? 2- considerando que esse ${montadoras} seja um array ou list de Strings, onde tem nessa parte:

 <option value="${montadora.nome}" ${produtoVaz.montadora eq montadora.nome ? "SELECTED" : ""}>${montadora.nome}</option>

eu faria assim

 <option value="${montadora}" ${produtoVaz.montadora eq montadora ? "SELECTED" : ""}>${montadora}</option>

Se montadora também for uma tabela separada no banco de dados, depende do seu negócio, mas eu ciaria uma entiadade Montadora e relacionava ela com o ProdutoVaz

no seu caso

public class ProdutoVaz(){

//1 produtoVaz possui uma montadora
//e uma montadora pode montar vários produtos vaz
@ManyToOne
//chave estrangeira na tabela produto_vaz que aponta  //para a tabela monradora
@JoinColumn(name="montadora_id")
private Montadora montadora;

}

eu tenho um sistema que tem esse tipo de relacionamento, uma matéria tem um tipo matéria e um tipo matéria pode pertencer a várias matérias

@Entity
@Table(name = "materia")
public class Materia  implements Serializable{

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    @Column(name = "materia_id")
    private Integer materiaId;

    @ManyToOne
    @JoinColumn(name = "tipo_materia_id")
    private TipoMateria tipoMateria;
//...
}
@Entity
@Table(name = "tipo_materia")
public class TipoMateria implements Serializable{


    private static final long serialVersionUID = 1L;


    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    @Column(name = "tipo_materia_id")
    private Integer tipoMateriaId;
    @Column(name="nome")
    private String nome;

//...
}

no meu controller eu didponibilizo uma lista de tiposMateria

@Controller
public class MateriasController {

    @Inject
    private Result result;

    @Inject //dao de tipo materias
    private TipoMaterias tipomaterias;
    @Inject //dao de materias
    private Materias materias;

    @Get("/materias/{diarioId}/nova")
    public void materia(Integer diarioId) {
    result.include("tipoMaterias",tipomaterias.findAllTipoPublicacao());

    }

    @Post("/materias/salvar")
    public void salvar(Materia materia){

        materias.insert(materia);
        //....
        }    
    }

no meu jsp a combobox de tipos matéria, quando vc seleciona ele copia o id do tipo matéria selecionado para o id do tipo matéria da matéria

    <div class="form-group">
                <label>Tipo Matéria</label> <select name="materia.tipoMateria.tipoMateriaId"
                    id="tipos" class="form-control">
                    <option value=""></option>
                    <c:forEach items="${tipoMaterias}" var="tipo">
                        <option value="${tipo.tipoMateriaId}"
                            <c:if test="${materia.tipoMateria.tipoMateriaId == tipo.tipoMateriaId}">selected="selected"</c:if>>${tipo.nome}</option>
                    </c:forEach>
                </select>
            </div>
solução!

Então Ricardo, analisando o erro, verifiquei que o problema não estava no momento de salvar o registro...

E sim no redirect, para a listaVaz...

Alterei na listaVaz os campos para as classes que contem o registro...

Por exemplo: Onde estava => produto.montadora Alterei para => produto.produtoVaz.montadora

Pois o atributo montadora é do produtoVaz e não do produto

Agora vou partir pra alteração do TypedQuery...

Mais uma vez, muito obrigado pela atenção!!

Um abraço!!

.....