java – Id e Produto ficando null quando salvo dados Many To One

Sempre que eu tenho criar uma Lista de itemPedido e usar ele em uma mapper para request, ela acaba como id e produto null. Já trackei com o debugger e ele não pega a referência com o idProduto que eu coloco no Postman. Sou novo nisso então certo q estou deixando passar algo.

O processo seria: Criar um Pedido, que possui uma lista de itemPedido com os atributos Produto e quantidade. Mas o Produto fica como null.

Classe Pedido:

”’
@Entity
@AllArgsConstructor
@NoArgsConstructor
public class Pedido {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Valid
@ManyToOne
@JoinColumn(name = "id_usuario_solicitante")
private Usuario solicitante;

@Valid
@ManyToOne
@JoinColumn(name = "id_endereco")
private Endereco enderecoEntrega;

@Valid
@ManyToOne
@JoinColumn(name = "id_estabelecimento", nullable = false)
private Estabelecimento estabelecimento;

@Valid
@OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumn(name = "id_pedido")
private List<ItemPedido> itensPedido;

@Valid
@Enumerated(EnumType.STRING)
private FormaPagamento formaPagamento;

@Enumerated(EnumType.STRING)
private StatusPedido status;

@JsonFormat(pattern = "dd/MM/yyyy HH:mm:ss")
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
private LocalDateTime horarioSolicitacao;

@JsonFormat(pattern = "dd/MM/yyyy HH:mm:ss")
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
private LocalDateTime horarioSaiuParaEntrega;

@JsonFormat(pattern = "dd/MM/yyyy HH:mm:ss")
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
private LocalDateTime horarioEntrega;

@JsonFormat(pattern = "dd/MM/yyyy HH:mm:ss")
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
private LocalDateTime horarioCancelamento;

private BigDecimal valorTotal;

@Valid
@ManyToOne
@JoinColumn(name = "id_entregador")
private Entregador entregador;

public Long getId() {
    return id;
}

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

public Usuario getSolicitante() {
    return solicitante;
}

public void setSolicitante(Usuario solicitante) {
    this.solicitante = solicitante;
}

public Endereco getEnderecoEntrega() {
    return enderecoEntrega;
}

public void setEnderecoEntrega(Endereco enderecoEntrega) {
    this.enderecoEntrega = enderecoEntrega;
}

public Estabelecimento getEstabelecimento() {
    return estabelecimento;
}

public void setEstabelecimento(Estabelecimento estabelecimento) {
    this.estabelecimento = estabelecimento;
}

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

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

public FormaPagamento getFormaPagamento() {
    return formaPagamento;
}

public void setFormaPagamento(FormaPagamento formaPagamento) {
    this.formaPagamento = formaPagamento;
}

public StatusPedido getStatus() {
    return status;
}

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

public LocalDateTime getHorarioSolicitacao() {
    return horarioSolicitacao;
}

public void setHorarioSolicitacao(LocalDateTime horarioSolicitacao) {
    this.horarioSolicitacao = horarioSolicitacao;
}

public LocalDateTime getHorarioSaiuParaEntrega() {
    return horarioSaiuParaEntrega;
}

public void setHorarioSaiuParaEntrega(LocalDateTime horarioSaiuParaEntrega) {
    this.horarioSaiuParaEntrega = horarioSaiuParaEntrega;
}

public LocalDateTime getHorarioEntrega() {
    return horarioEntrega;
}

public void setHorarioEntrega(LocalDateTime horarioEntrega) {
    this.horarioEntrega = horarioEntrega;
}

public LocalDateTime getHorarioCancelamento() {
    return horarioCancelamento;
}

public void setHorarioCancelamento(LocalDateTime horarioCancelamento) {
    this.horarioCancelamento = horarioCancelamento;
}

public BigDecimal getValorTotal() {
    return valorTotal;
}

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

public Entregador getEntregador() {
    return entregador;
}

public void setEntregador(Entregador entregador) {
    this.entregador = entregador;
}

}”’

Classe ItemPedido:

”’@Entity
public class ItemPedido {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

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

private Integer quantidade;

public Long getId() {
    return id;
}

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

public Produto getProduto() {
    return produto;
}

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

public Integer getQuantidade() {
    return quantidade;
}

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

}
”’

Classe CriarPedidoRequest:

”’
@Getter
@Setter
@AllArgsConstructor
public class CriarPedidoRequest {

private Long idPedido;
private Long idEstabelecimento;
private Long idUsuarioSolicitante;
private Long idEnderecoEntrega;
private List<ItemPedido> itens;
private FormaPagamento formaPagamento;
private StatusPedido status;
private LocalDateTime horarioSolicitacao;
private LocalDateTime horarioSaiuParaEntrega;
private LocalDateTime horarioEntrega;
private LocalDateTime horarioCancelamento;
private BigDecimal valorTotal;
private Long idEntregador;
private Long idProduto;
private Integer quantidade;

}”’

Classe CriarPedidoService:

”’
@Service
public class CriarPedidoService {

@Autowired
private PedidoRepository pedidoRepository;

@Autowired
private CriarPedidoMapper criarPedidoMapper;

@Autowired
private ProdutoRepository produtoRepository;

@Autowired
private ItemPedidoRepository itemPedidoRepository;

public Pedido salvarPedido(CriarPedidoRequest request) {

    Pedido pedido = criarPedidoMapper.mapear(request);
    pedido.setStatus(StatusPedido.EM_PREPARO);
    pedido.setHorarioSolicitacao(LocalDateTime.now());

    Produto produto = produtoRepository.findById(request.getIdProduto()).get();

    List<ItemPedido> itens = new ArrayList<>();
    ItemPedido itemPedido = new ItemPedido();

    itemPedido.setProduto(produto);
    itemPedido.setQuantidade(request.getQuantidade());
    itens.add(itemPedido);

    pedido.setItensPedido(itens);

    return pedidoRepository.save(pedido);
}

}”’

CriarPedidoMapper:

”’
@Component
public class CriarPedidoMapper {

@Autowired
private UsuarioRepository usuarioRepository;

@Autowired
private EnderecoRepository enderecoRepository;

@Autowired
private EstabelecimentoRepository estabelecimentoRepository;

@Autowired
private EntregadorRepository entregadorRepository;

@Autowired
private ProdutoRepository produtoRepository;

@Autowired
private ItemPedidoRepository itemPedidoRepository;


public Pedido mapear(CriarPedidoRequest request) {

    Usuario usuario = usuarioRepository
            .findById(request.getIdUsuarioSolicitante()).get();

    Endereco enderecoEntrega = enderecoRepository
            .findById(request.getIdEnderecoEntrega()).get();

    Estabelecimento estabelecimento = estabelecimentoRepository
            .findById(request.getIdEstabelecimento()).get();

    Entregador entregador = entregadorRepository
            .findById(request.getIdEntregador()).get();

    Produto produto = produtoRepository
            .findById(request.getIdProduto()).get();

    BigDecimal valor = produto.getValor();
    Integer quantidade = request.getQuantidade();
    BigDecimal valorTotal = BigDecimal.valueOf(quantidade).multiply(valor);



    return new Pedido(request.getIdPedido(), usuario, enderecoEntrega, estabelecimento, request.getItens(),
            request.getFormaPagamento(), request.getStatus(), request.getHorarioSolicitacao(),
            request.getHorarioSaiuParaEntrega(), request.getHorarioEntrega(),
            request.getHorarioCancelamento(), valorTotal, entregador);
}

}
”’

Json:

”’
{
“idEstabelecimento”: 1,
“idUsuarioSolicitante”: 1,
“idEnderecoEntrega”: 1,
“formaPagamento”: “PIX”,
“itens”: (
{
“idProduto”: 1,
“quantidade”: 1
},
{
“idProduto”: 2,
“quantidade”: 2
}
)
}
”’