如何在春季发送具有多对多关系的POST请求?

时间:2019-07-21 19:20:06

标签: spring spring-boot spring-data-jpa

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

订单实体

 @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中的添加功能

 @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);          
} 

1 个答案:

答案 0 :(得分:0)

我在那儿看到了一个错误,莱姆试图帮助您。由于您的问题不清楚,因此请让我知道是否有效:

您在那里有两个双向映射:

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

尽管它们都是双向的,但是您都在使用@JoinColumn。请查看this。定义双向关系时,应始终使用mappedBy属性。

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

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

看看这个answer来检查应如何在JSON POST上格式化少量实体。