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
}