【问题标题】:How to send POST request with Many-to-many relationship in Spring?如何在 Spring 中发送具有多对多关系的 POST 请求?
【发布时间】:2019-07-21 19:20:06
【问题描述】:

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

订单实体

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

【问题讨论】:

  • 请分享预期的输出以及您面临的错误。

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


【解决方案1】:

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

那里有两个双向映射:

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

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

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

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

查看此answer,了解应如何在 JSON POST 上格式化实体。

【讨论】:

  • 谢谢,我修复了映射,但在邮递员的帖子请求中,我不知道如何添加 orderEquipment {"observateurEmail" :"test@gmail.com","object" 的列表:"order","description":"desc", ....} 保存。
  • 我已经编辑了答案。请检查我添加的额外链接,了解实体列表在 JSON POST 上的格式。
  • 这并没有真正回答我的问题,我需要发送 orderEquipment 列表,其中包含一个设备、一个数量和一个已经在同一时刻创建它的订单。
  • 等一下... OrderEquipment 对象是两个父亲的儿子... 您一次只能通过 JSON POST 为其分配一个父亲。如果你想建立映射到那里的所有关系,你应该发布一个 JSON,其中包含一个 Order 映射一个 OrderEquipment 列表,另一个帖子包含一个 Equipment 映射一个 OrderEquipment 列表。
  • 好吧,谢谢,我终于尝试先保存订单,然后再保存 orderEquipment 对象,这很好......
猜你喜欢
  • 2019-01-29
  • 1970-01-01
  • 1970-01-01
  • 2019-08-08
  • 2019-12-20
  • 2022-12-01
  • 2018-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多