1
resposta

erro método PUT em relacionamento OneToOne Spring boot 2.1.1

Estou tentando criar um método PUT no PedidoResource. Está retomando esse exceção

 {
    "timestamp": 1556912267762,
    "status": 500,
    "error": "Internal Server Error",
    "message": "attempted to assign id from null one-to-one property [********.domain.Pagamento.pedido]; nested exception is org.hibernate.id.IdentifierGenerationException: attempted to assign id from null one-to-one property [********.domain.Pagamento.pedido]",
    "path": "/pedidos/3"
}

No PedidoResource está assim...

   @RequestMapping(value="/{id}", method=RequestMethod.PUT)
    public ResponseEntity<Void> update(@Valid @RequestBody Pedido obj, @PathVariable Integer id) {
        obj.setId(id);
        obj = service.update(obj);
        return ResponseEntity.noContent().build();
    }

No ProdutoService está identico ao método insert, somente retirei a linha obj.setId(null);  , o POST funciona perfeitamente

    public Pedido update(Pedido obj) {
        obj.setInstante(new Date());
        obj.setCliente(clienteService.find(obj.getCliente().getId()));
        obj.getPagamento().setEstado(EstadoPagamento.PENDENTE);
        obj.getPagamento().setPedido(obj);
        if (obj.getPagamento() instanceof PagamentoComBoleto) {
            PagamentoComBoleto pagto = (PagamentoComBoleto) obj.getPagamento();
            boletoService.preencherPagamentoComBoleto(pagto, obj.getInstante());
        }
        obj.setStatus((byte) 0);
        obj.setSic(0);
        obj = repo.save(obj);
        pagamentoRepository.save(obj.getPagamento());
        for (ItemPedido ip : obj.getItens()) {
//          ip.setDesconto(0.0);
            ip.setProduto(produtoService.find(ip.getProduto().getId()));
            ip.setPreco(ip.getProduto().getPreco());
            ip.setPedido(obj);
        }
        itemPedidoRepository.saveAll(obj.getItens());
        return obj;
    }

esse são os dados q envio pelo Postman

{
 "cliente" : {"id" : 1},
 "enderecoDeEntrega" : {"id" : 1},
 "pagamento" : {
 "numeroDeParcelas" : 10,
 "@type": "pagamentoComCartao"
 },
 "itens" : [
     {
         "quantidade" : 3,
         "produto" : {"id" : 3},
         "desconto": 0
     },
     {
         "quantidade" : 1,
         "produto" : {"id" : 1},
         "desconto": 0
     }
 ]
}

a class domain Pedido está assim

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

    @JsonFormat(pattern="dd/MM/yyyy HH:mm")
    private Date instante;

    @OneToOne(optional = false, cascade=CascadeType.ALL, mappedBy="pedido")
    private Pagamento pagamento;

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

    @OneToMany(mappedBy="id.pedido")
    private Set<ItemPedido> itens = new HashSet<>();

    @ManyToOne
    @JoinColumn(name="vendedor_id")
    private Vendedor vendedor;

Como posso resolver isso...? Desde já agradeço

1 resposta

Como está sua classe Pagamento ?

@OneToOne(optional = false, cascade=CascadeType.ALL, mappedBy="pedido")
    private Pagamento pagamento;

Muito provavelmente você não setou o objeto pedido dentro do Pagamento e está mandando persistir