Id and Product getting null when saving data Many To One

Asked

Viewed 39 times

-1

Whenever I try to create an itemPedido list and use it in a request mapper, it ends up as id and null product. Already trackei with the Debugger and it does not catch the reference with the idProduct that I put in Postman. I’m new at this and I’m sure I’m missing something.

The process would be: Create an Order that has a list of itemPedido with the attributes Product and quantity. But the Product is null.

Request Class:

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

Itempedido class:

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

Class Creatoredorequest:

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

Class Creatorservice:

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

Criapedidomapper:

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

1 answer

0

Your method of service is not noted with @Transactional, thus operations are not executed within a Transactional block.

@Transactional
public Pedido salvarPedido(CriarPedidoRequest request) {
    ...
}

As you are utilizing Spring, beware to utilize the annotation of Spring

But what a transactional block does?

First let’s understand the states of an object, which can be Persistent, Transient or Detached, and are described in that part of the documentation.

When you don’t specify that your entire method will be part of a transactional block, your changes are handled separately.

If you define a transactional block (declaring @Transactional in its method), the objects loaded in this block will be persistent, and at the end of the block, the changes in these objects will be identified and committed.

It Might just have been saved or Loaded, However, it is by Definition in the Scope of a Session. Hibernate will Detect any changes made to an Object in persistent state and Synchronize the state with the database when the Unit of work completes.

Browser other questions tagged

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