Problems with JPA - Hibernate does not persist WHOLE object

Asked

Viewed 949 times

4

Good morning guys!

I have the following entities:

package br.com.sistema.entidade;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name="TB_Carrinho")
@IdClass(CarrinhoDeComprasID.class)
public class CarrinhoDeCompras {

    @Id
    @ManyToOne
    @JoinColumn(name="id_produto")
    private Produto produto;

    @Id
    @ManyToOne
    @JoinColumn(name="id_venda")
    private Venda venda;

    private Integer quantidade;

    public Produto getProduto() {
        return produto;
    }

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

    public Venda getVenda() {
        return venda;
    }

    public void setVenda(Venda venda) {
        this.venda = venda;
    }

    public Integer getQuantidade() {
        return quantidade;
    }

    public void setQuantidade(Integer quantidade) {
        this.quantidade = quantidade;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((produto == null) ? 0 : produto.hashCode());
        result = prime * result
                + ((quantidade == null) ? 0 : quantidade.hashCode());
        result = prime * result + ((venda == null) ? 0 : venda.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        CarrinhoDeCompras other = (CarrinhoDeCompras) obj;
        if (produto == null) {
            if (other.produto != null)
                return false;
        } else if (!produto.equals(other.produto))
            return false;
        if (quantidade == null) {
            if (other.quantidade != null)
                return false;
        } else if (!quantidade.equals(other.quantidade))
            return false;
        if (venda == null) {
            if (other.venda != null)
                return false;
        } else if (!venda.equals(other.venda))
            return false;
        return true;
    }
}
package br.com.sistema.entidade;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table(name="TB_PRODUTO")
public class Produto implements Serializable{

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    private Integer id;

    private String descricao;

    @Column(name="data_cadastro")
    @Temporal(TemporalType.DATE)
    private Date dataCadastro;

    private Double valor;

    @Column(name="quantidade_vendida")
    private Integer quantidadeVendida = 0;

    //Construtores  
    public Produto() {  
    }

    public Produto(String descricao, Date dataCadastro,
            Double valor) {
        this.descricao = descricao;
        this.dataCadastro = dataCadastro;
        this.valor = valor;
    }

    // Get's e Set's 
    public Integer getId() {
        return id;
    }

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

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public Date getDataCadastro() {
        return dataCadastro;
    }

    public void setDataCadastro(Date dataCadastro) {
        this.dataCadastro = dataCadastro;
    }

    public Double getValor() {
        return valor;
    }

    public void setValor(Double valor) {
        this.valor = valor;
    }

    public Integer getQuantidadeVendida() {
        return quantidadeVendida;
    }

    public void setQuantidadeVendida(Integer quantidadeVendida) {
        this.quantidadeVendida = quantidadeVendida;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result
                + ((dataCadastro == null) ? 0 : dataCadastro.hashCode());
        result = prime * result
                + ((descricao == null) ? 0 : descricao.hashCode());
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        result = prime
                * result
                + ((quantidadeVendida == null) ? 0 : quantidadeVendida
                        .hashCode());
        result = prime * result + ((valor == null) ? 0 : valor.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Produto other = (Produto) obj;
        if (dataCadastro == null) {
            if (other.dataCadastro != null)
                return false;
        } else if (!dataCadastro.equals(other.dataCadastro))
            return false;
        if (descricao == null) {
            if (other.descricao != null)
                return false;
        } else if (!descricao.equals(other.descricao))
            return false;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        if (quantidadeVendida == null) {
            if (other.quantidadeVendida != null)
                return false;
        } else if (!quantidadeVendida.equals(other.quantidadeVendida))
            return false;
        if (valor == null) {
            if (other.valor != null)
                return false;
        } else if (!valor.equals(other.valor))
            return false;
        return true;
    }
}
package br.com.sistema.entidade;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;


@Entity
@Table(name="TB_VENDA")
public class Venda implements Serializable{

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    @Column(name="venda_id")
    private Integer vendaId;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="id_cliente", nullable=false) // No banco esse campo vai se chamar id_cliente | Não pode ser nulo
    private Cliente cliente;

    @OneToMany(mappedBy="venda")
    private List<CarrinhoDeCompras> produto;

    @Column(name="data_venda")
    @Temporal(TemporalType.DATE)
    private Date dataVenda;

    private Double valorTotal;

    @Column(name="flag_venda_ativa")
    private Integer flagVendaAtiva;

    //Construtor
    public Venda(){

    }

    public Venda(List<CarrinhoDeCompras> p, Cliente c){
        this.produto = p;
        this.cliente = c;
    }

    public Cliente getCliente() {
        return cliente;
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    public List<CarrinhoDeCompras> getProduto() {
        return produto;
    }

    public void setProduto(List<CarrinhoDeCompras> produto) {
        this.produto = produto;
    }

    public Date getDataVenda() {
        return dataVenda;
    }

    public void setDataVenda(Date dataVenda) {
        this.dataVenda = dataVenda;
    }

    public Integer getVendaId() {
        return vendaId;
    }

    public void setVendaId(Integer vendaId) {
        this.vendaId = vendaId;
    }

    public Double getValorTotal() {
        return valorTotal;
    }

    public void setValorTotal(Double valorTotal) {
        this.valorTotal = valorTotal;
    }

    public Integer getFlagVendaAtiva() {
        return flagVendaAtiva;
    }

    public void setFlagVendaAtiva(Integer flagVendaAtiva) {
        this.flagVendaAtiva = flagVendaAtiva;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((cliente == null) ? 0 : cliente.hashCode());
        result = prime * result
                + ((dataVenda == null) ? 0 : dataVenda.hashCode());
        result = prime * result
                + ((flagVendaAtiva == null) ? 0 : flagVendaAtiva.hashCode());
        result = prime * result + ((produto == null) ? 0 : produto.hashCode());
        result = prime * result
                + ((valorTotal == null) ? 0 : valorTotal.hashCode());
        result = prime * result + ((vendaId == null) ? 0 : vendaId.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Venda other = (Venda) obj;
        if (cliente == null) {
            if (other.cliente != null)
                return false;
        } else if (!cliente.equals(other.cliente))
            return false;
        if (dataVenda == null) {
            if (other.dataVenda != null)
                return false;
        } else if (!dataVenda.equals(other.dataVenda))
            return false;
        if (flagVendaAtiva == null) {
            if (other.flagVendaAtiva != null)
                return false;
        } else if (!flagVendaAtiva.equals(other.flagVendaAtiva))
            return false;
        if (produto == null) {
            if (other.produto != null)
                return false;
        } else if (!produto.equals(other.produto))
            return false;
        if (valorTotal == null) {
            if (other.valorTotal != null)
                return false;
        } else if (!valorTotal.equals(other.valorTotal))
            return false;
        if (vendaId == null) {
            if (other.vendaId != null)
                return false;
        } else if (!vendaId.equals(other.vendaId))
            return false;
        return true;
    }
}

What’s all the fuss that’s going on... When I execute the method salvage:

    @Override
    public void salvar(Object obj){
        try {
            abrirTransacao();
            this.em.persist(obj);
            fecharECommitarTransacao();
        } catch (Exception e) {
            System.out.println(e.getMessage());
            rollback();
        }
    }
package br.com.sistema.entidade;

import java.io.Serializable;

public class CarrinhoDeComprasID implements Serializable{

    private int produto;
    private int venda;

    public int getProduto() {
        return produto;
    }

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

    public int getVenda() {
        return venda;
    }

    public void setVenda(int venda) {
        this.venda = venda;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + produto;
        result = prime * result + venda;
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        CarrinhoDeComprasID other = (CarrinhoDeComprasID) obj;
        if (produto != other.produto)
            return false;
        if (venda != other.venda)
            return false;
        return true;
    }       
}

https://www.filepicker.io/api/file/nMCM9TYRTT66EKqRaF7X
It only saves the sale object without the references, that is, saved in the Sales table but the Cart is empty. Does anyone have any solution or idea to this problem? Grateful for the attention.

  • Partner, if you want something to facilitate your projects using Hibernate, here’s a link that can help you: https://github.com/KaynanCoelho/generic-repository

2 answers

2


Open your entity Venda and where you mapped the Carrinho:

@OneToMany(mappedBy="venda")
private List<CarrinhoDeCompras> produto;

Add the Cascade:

@OneToMany(mappedBy="venda", cascade = {CascadeType.PERSIST, CascadeType.MERGE })
private List<CarrinhoDeCompras> produto;

Then try saving again. Give a read on the Cascades that will help you a lot. Here’s a excellent article.

0

You have already debugged your code and checked whether the object that arrives in the save method is populated with List attributes. I suggest you force the parameter passage before calling the save method

Example in your Voce controller can do so

public class MinhaController {
    private class Venda venda;
    private class Service service;
    private List<CarrinhoDeProdutos> produtosList;

    public void salvar() {
        venda.setProdutos(produtosList);
        service.salvar(venda);
    }
}
  • Yes yes, check it out. It’s almost that way, but I can assure you that the object is ALL populated.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.