首页 > 解决方案 > 如何在 Spring 中发送具有多对多关系的 POST 请求?

问题描述

我正在尝试添加带有设备列表的订单,这是我的实体:

订单实体

 @Entity @Table(name = "orders") public class Order extends Ticket{
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
private Set<OrderEquipment> orderEquipments = new HashSet<>();}

设备实体

 @Entity @Table(name = "equipments") public class Equipment extends DateAudit {

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

@NotBlank
@Size(max = 30)
private String name;


@NotNull
private Long nbr_piece ;

@OneToMany(mappedBy = "equipment", cascade = CascadeType.ALL, orphanRemoval = true)
private Set<OrderEquipment> orderEquipments = new HashSet<>();}

和 order_equipment 实体

@Entity @Table(name = "order_equipment") public class OrderEquipment extends DateAudit { @Id
@ManyToOne
@JoinColumn(name = "order_id")
private Order order;

@Id
@ManyToOne
@JoinColumn(name = "equipment_id")
private Equipment equipment;

@NotBlank
@Column(name = "quantity")
private Long quantity;}

这是 orderController 中的 add 函数

 @PostMapping("/orders")
public Order createOrder(@Valid @RequestBody Order Order){
 Order.setObservateurEmail(Order.getObservateurEmail());
 Order.setObject(Order.getObject());
 Order.setDescription(Order.getDescription());      
 return orderRepository.save(Order);          
} 

标签: springspring-bootspring-data-jpa

解决方案


我在那里看到了一个错误,让我试着帮助你。由于您的问题不清楚,请让我知道它是否有效/无效:

你有两个双向映射:

  • 订单(所有级联)<-> OrderEquipment
  • 设备(所有级联)<-> OrderEquipment

您对它们都使用 @JoinColumn,即使它们是双向的。请看看这个。在定义双向关系时,您应该始终使用该mappedBy属性。

现在,您从 POST 请求接收一个 Order 对象,对 3 个属性进行更改,然后保存它。由于 和 之间的映射Order具有OrderEquipment属性CascadeType.ALL,因此对 Order 对象的任何保存都将保存所有与 OrderEquipment 关联的子项。如果您收到的 Order 对象已经有 OrderEquipment 子对象,您的方法也将保存/更新它们。

您的 POST 映射对我来说看起来不错,只需注意您的表关系定义。

查看此答案以检查应如何在 JSON POST 上格式化实体。


推荐阅读