Problems with JPA - Hibernate does not persist EVERY object

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 is the scolding that is happening ... When I run the save method:

    @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;
    }       
}


It only saves the sale object without the references, ie saved in the Sales table but the Cart is empty. Does anyone have any solutions or ideas for this problem? Thank you for your attention.

    
asked by anonymous 26.12.2014 / 17:57

2 answers

2

Open your entity Venda and where you have mapped Carrinho :

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

Add Cascade:

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

Then try saving again. Read about the Cascades that will help you a lot. Here's a excellent article

    
28.03.2015 / 22:30
0

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

Example in your controller you 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);
    }
}
    
28.12.2014 / 15:26