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

Java 保存多对多实体时出现问题,java,spring,hibernate,jpa,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") priv

这是我的实体:

@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> {

}
邮递员的电话:

{
    "quantidade":33,
    "pedido_id":1,
    "produto_id":4
}
但是,只有
quantidade
id
属性是满的。
属性
pedido\u id
produto\u id
没有保存有什么问题?

您的实体
ProdutoPedido
produto
对象

若将1传递给produto,它将不会被映射,并且值将保持为null

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

你可以尝试两种方法

第一名:

假设
Produto
Pedido
对象具有“id”字段,则将您的JSON从UI更改为如下内容

希望它能转换成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);
}

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

ProdutoPedidoDTO的id属性不是必需的

此外,我必须将方法“salvar”的返回类型从produtopedidodo更改为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 call的外观:

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

感谢您的输入。

因此,您在这里问我的基本问题是:更改produtoPedidoRepository以保存“produto”实例而不是“produtoPedido”实例?很抱歉,最后一行将仅为produtoPedido。存储库将在第二种方法中提醒相同的问题。只是添加dto。对象,该对象的ID为Produto的int。或者您可以尝试第一种方法,看看它是否有效。更改只在json方面。根据第二种方法,它应该是调用的json吗?json将保持与您所添加的相同。
{
    "quantidade":66,
    "pedido":1,
    "produto":3
}