2
respostas

Erro ao tentar salvar um objeto pai com os filhos

Boa tarde. Estou com o seguinte tenho uma classe Venda e outra ProdutoVenda, onde a classe venta contem uma lista de produtoVenda, quando tento salvar a classe o dados da classe venda dar um erro ao tentar inserir os dados da classe produtoVenda, ele reclama que o id da classe pai esta nullo na classe filha.

Segue abaixo o codigo.



import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Date;
import java.util.List;

import javax.persistence.*;

import lombok.Getter;
import lombok.Setter;

@Entity
@Table(name = "pdv_venda")
@Getter
@Setter
public class Venda extends AbstractEntity implements Serializable {

    private static final long serialVersionUID = 4203174084588806620L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "venda_id")
    private Long id;

    @Column(nullable = false)
    private Date data;

    @Column(columnDefinition = "DECIMAL(10,2)")
    private BigDecimal total;

    @Column(columnDefinition = "DECIMAL(10,2)")
    private BigDecimal descontos;

    @ManyToOne
    @JoinColumn(name = "caixa_id")
    private Caixa caixa;

    @ManyToOne
    @JoinColumn(name = "cliente_id")
    private Cliente cliente;

    @OneToMany(mappedBy = "venda", cascade = CascadeType.ALL)
    private List<ProdutoVenda> produtoVendas;

}

import java.io.Serializable;
import java.math.BigDecimal;

import javax.persistence.*;

import lombok.Getter;
import lombok.Setter;

@Entity
@Table(name = "pdv_produto_venda")
@Getter
@Setter
public class ProdutoVenda extends AbstractEntity implements Serializable {

    private static final long serialVersionUID = 4203174084588806620L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "prod_vend_id")
    private Long id;

    @Column(columnDefinition = "DECIMAL(10,2)")
    private BigDecimal valor;

    @Column(length = 100)
    private Long quantidade;

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

    @ManyToOne
    @JoinColumn(name = "venda_id", nullable = false)
    private Venda venda;

}
@Override
    public VendaDTO save(VendaDTO dto) {
        Venda entity = convert.convertToEntity(dto);
        entity = dao.save(entity);
        return convert.convertToDTO(entity);
    }

Errooooo

Hibernate: insert into pdv_venda (caixa_id, cliente_id, data, descontos, total, venda_id) values (?, ?, ?, ?, ?, ?)
Hibernate: insert into pdv_produto_venda (produto_id, quantidade, valor, venda_id, prod_vend_id) values (?, ?, ?, ?, ?)
2018-03-19 13:14:57.535  WARN 6524 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 0, SQLState: 23502
2018-03-19 13:14:57.536 ERROR 6524 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper   : ERROR: null value in column "venda_id" violates not-null constraint
  Detalhe: Failing row contains (25, null, 2, 7, 77.00, null).
2018-03-19 13:14:57.570 ERROR 6524 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[.[dispatcherServlet]      : Servlet.service() for servlet [dispatcherServlet] in context with path [/api] threw exception [Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [venda_id]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement] with root cause

org.postgresql.util.PSQLException: ERROR: null value in column "venda_id" violates not-null constraint
  Detalhe: Failing row contains (25, null, 2, 7, 77.00, null).
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2455) ~[postgresql-9.4.1212.jre7.jar:9.4.1212.jre7]
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2155) ~[postgresql-9.4.1212.jre7.jar:9.4.1212.jre7]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_152-release]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_152-release]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_152-release]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_152-release]
    at org.apache.tomcat.jdbc.pool.StatementFacade$StatementProxy.invoke(StatementFacade.java:114) ~[tomcat-jdbc-8.5.23.jar:na]
    at com.sun.proxy.$Proxy99.executeUpdate(Unknown Source) ~[na:na]
    at org.hibernate.engine.jdbc.intern

Pelo o que eu entendir o venda_id esta nullo no ProdutoVenda, alguém poderia me dar uma ajuda ? Att...

2 respostas

Opa, você precisa setar o produto no produto venda antes de chamar o save do produto. O hibernate vai aplicar o save em todo mundo, mas não vai setar o id do produto no produtovenda automaticamente.

Entendo, já vi em algum lugar um exemplo onde o JPA faz essa atribuição automaticamente, vou dar uma pesquisada para encontra essa algum exemplo.

Valeu