保存多对多实体时出现问题

时间:2019-12-05 04:04:42

标签: java spring hibernate jpa

这是我的实体:

@Entity
@Table(name = "item_pedido")
public class ProdutoPedido {

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

    @ManyToOne(cascade = {CascadeType.ALL})
    @JoinColumn(name = "produto_id")
    private Produto produto;

    @ManyToOne(cascade = {CascadeType.ALL})
    @JoinColumn(name = "pedido_id")
    private Pedido pedido;

    private int quantidade;

    // getters and setters omitted
}

存储库:

public interface ProdutoPedidoRepository extends CrudRepository<ProdutoPedido, Long> {

}

以及控制器的保存方法:

@PostMapping("/itensdevendas")
    public ProdutoPedido salvarProdutoPedido(@RequestBody ProdutoPedido produtoPedido) {
        return produtoPedidoRepository.save(produtoPedido);
    }

邮递员的电话:

{
    "quantidade":33,
    "pedido_id":1,
    "produto_id":4
}

但是,只有quantidadeid属性是完整的。 没有保存属性pedido_idproduto_id怎么了?

2 个答案:

答案 0 :(得分:0)

您的实体ProdutoPedidoProduto个对象。

如果您为产品传递1,它将不会被映射,并且值将保持为空。

注意:我假设Produto和Pedido的数据已经存在1和4。

您可以尝试2种方法

第一

假设ProdutoPedido对象具有“ id”字段,请将UI的JSON更改为类似的内容。

希望它将转换为Produto和Pedido对象。

通过使用控制器方法打印进行确认。

{
    "quantidade":33,
    "pedido_id": { "id" : 1 },
    "produto_id": { "id" : 4 }
}

第二:

您需要添加这样的DTO并将其用于UI映射。

ProdutoPedidoDTO {

    private Long id;
    private int produto;
    private int pedido;
    private int quantidade;

}


@PostMapping("/itensdevendas")
public ProdutoPedidoDTO salvarProdutoPedido(@RequestBody ProdutoPedidoDTO produtoPedido) {

    ProdutoPedido prodPedido = new ProdutoPedido();
    // add values

    // add Produto obj to ProdutoPedido
    Produto produto = new Produto();
    produto.setId(produtoPedido.getProduto()):
    prodPedido.setProduto(produto);

    // do same for Pedido 

    return produtoPedidoRepository.save(prodPedido);
}

答案 1 :(得分:0)

我欠你一杯啤酒。它进行了一些修改。我在这里列出它们:

不需要ProdutoPedidoDTO的id属性。

此外,我不得不将方法“ salvar”的返回类型从ProdutoPedidoDTO更改为ProdutoPedido。

@PostMapping("/itensdevendas")
    public ProdutoPedido salvarProdutoPedido(@RequestBody ProdutoPedidoDTO produtoPedidoDTO) {

        ProdutoPedido prodPedido = new ProdutoPedido();
        // add values

        System.out.println("Primeiro: " + produtoPedidoDTO.getProduto());

        // add Produto obj to ProdutoPedido
        Produto produto = new Produto();
        //produto.setId(produtoPedidoDTO.getProduto());
        produto = produtoRepository.findById(produtoPedidoDTO.getProduto()).get();
        prodPedido.setProduto(produto);

        System.out.println("Segundo: " + produtoPedidoDTO.getPedido());

        // do same for Pedido 
        Pedido pedido = new Pedido();
        // pedido.setId(produtoPedidoDTO.getPedido());
        pedido = pedidoRepository.findById(produtoPedidoDTO.getPedido()).get();
        prodPedido.setPedido(pedido);

        prodPedido.setQuantidade(produtoPedidoDTO.getQuantidade());

        return produtoPedidoRepository.save(prodPedido);
    }

最后,这是Post调用的样子:

{
    "quantidade":66,
    "pedido":1,
    "produto":3
}

谢谢您的投入。