skip to Main Content

What do I need to do for the fk of the child table to be automatically filled? I’m using JPA, Spring Boot, MySql

The JSON in Postman is sent successfully, but the Request attribute is not filled in and neither is the fk column (id_pedido) in the items_pedido table.

enter image description here

Pedido is the father classe:

package com.vendas.model;

import java.util.Date;
import java.util.List;

import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;

@Entity(name="pedidos")
@Table(name="pedidos")
public class Pedido{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id_pedido", updatable = false, nullable = false)
    private Long idPedido;
    
    @Column(name="data_pedido")
    private Date dataPedido;
    
    @Column(name="status")
    private int status;
    
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "pedido")
    private List<ItensPedido> itensPedido;
        
    public Pedido() {
        super();
    }

    public Long getIdPedido() {
        return idPedido;
    }

    public void setIdPedido(Long idPedido) {
        this.idPedido = idPedido;
    }

    public Date getDataPedido() {
        return dataPedido;
    }

    public void setDataPedido(Date dataPedido) {
        this.dataPedido = dataPedido;
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    } 

    public List<ItensPedido> getItensPedido() {
        return itensPedido;
    }

    public void setItensPedido(List<ItensPedido> itensPedido) {
        this.itensPedido = itensPedido;
    }
    
    
    
    
}

Itens_pedido is the children class:

package com.vendas.model;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;

@Entity(name="itens_pedido")
@Table(name="itens_pedido")
public class ItensPedido{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id_item_pedido", updatable = false, nullable = false)
    private Long idItemPedido;
    @Column(name="id_produto")
    private Long idProduto;
    @Column(name="quantidade")
    private int quantidade;
    @Column(name="preco_venda")
    private double precoVenda;
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="id_pedido")
    private Pedido pedido;

    
    public ItensPedido() {
        super();
    }


    public Long getIdItemPedido() {
        return idItemPedido;
    }


    public void setIdItemPedido(Long idItemPedido) {
        this.idItemPedido = idItemPedido;
    }


    public Long getIdProduto() {
        return idProduto;
    }


    public void setIdProduto(Long idProduto) {
        this.idProduto = idProduto;
    }


    public int getQuantidade() {
        return quantidade;
    }


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


    public double getPrecoVenda() {
        return precoVenda;
    }


    public void setPrecoVenda(double precoVenda) {
        this.precoVenda = precoVenda;
    }


    public Pedido getPedido() {
        return pedido;
    }


    public void setPedido(Pedido pedido) {
        this.pedido = pedido;
    }


    
}

2

Answers


  1. Chosen as BEST ANSWER

    Your guidance worked well, but I understand that this should work automatically without needing this code in the Service.

    @Service
    @Transactional
    public class PedidoService {
    
        @Autowired
        private PedidoRepository repository;
        
        public Pedido create(Pedido pedido) {
            Pedido result = repository.save(pedido);
    
            result.getItensPedido().forEach((it) -> it.setPedido(result));
            
            return repository.save(result);
            
        }
    

    What would it take for it to work automatically?


  2. In the service class where you are persisting Pedido entity you should also set the relationship. Something like this:

    for (ItensPedido ip : pedido.getItensPedido()) {
        ip.setPedido(pedido);
    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search