ManyToOne 保存空引用



我正在学习Springboot/Hibernate,并且在使用ManyToOne符号时遇到了一些麻烦。

我有三个模型:订单、订单详情和产品。每个订单都有多个订单详细信息(一对多,这工作正常),每个订单详细信息都包含一个产品的ID(产品可以重复,因此应该是ManyToOne)。

发生的情况是,每次我尝试保存订单时,都会创建并保存详细信息,但每个详细信息中的产品(已存在于我的数据库中)都设置为空。在过去的 4 小时内,我已经尝试了在互联网上找到的所有内容,但尚未找到导致我问题的原因。

最少的代码,如果您需要更多详细信息,请告诉我:

@RestController
public class OrderController {
@Autowired
OrderRepository orderRepository;
@PostMapping("/orders")
public Order addOrder(@RequestBody Order order)
{
return orderRepository.save(order);
}
}
@Entity
@Table(name="orders")
public class Order {
@Id
@GeneratedValue
@Column(name = "order_id")
private Long id;
//...
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "order_id")
@Getter
@Setter
private List<OrderDetail> orderDetailList;

//...

^这很好用

@Entity
@Table(name="order_details")
public class OrderDetail {
@Id
@GeneratedValue
@Column(name = "order_detail_id")
private Long id;
//...
@ManyToOne(/*optional = false, */cascade = CascadeType.ALL, targetEntity=Product.class)
@JoinColumn(name = "product_id")
@Getter
@Setter
private Product product;
//...

^我已经评论optional=false否则我收到 500 错误,因为产品为空

@Entity
@Table(name="products")
public class Product {
@Id
@GeneratedValue
@Column(name="product_id")
private Long id;

//...
//  @OneToMany(mappedBy = "product", cascade = CascadeType.ALL, orphanRemoval = true)
//  private List<OrderDetail> orderDetailList;
//...
}

^ 我尝试添加或不添加关系的这一面,没有一个有效;我认为无论如何我都不需要它,因为我与我的详细信息的产品而不是我产品的详细信息进行交互。

这是我对/订单的邮递员POST请求:

{
"address": "Dorton Road 80",
"email": "tsayb@opera.com", 
"tel": "(0351) 48158101",
"schedule": "21:00",
"orderDetailList": [
{ "product_id": 1, 
"quantity": 1 },
{ "product_id": 2, 
"quantity": 1 }]
}

哪个返回

{
"address": "Dorton Road 80",
"email": "tsayb@opera.com",
"tel": "(0351) 48158101",
"schedule": "21:00",
"orderDetailList": [
{
"quantity": 1,
"product": null
},
{
"quantity": 1,
"product": null
}
]
}

请注意,产品为空,但我的产品 id 1 和 2 确实存在于产品 crud 中。为什么他们没有被保存(或归还)?

非常感谢您的时间。

每个订单详细信息都有一个产品的ID(产品可以重复,因此应该是ManyToOne)。

我认为你是对的。Many orderDetailOne product.

您能否检查数据库以查看product_id是否插入到order_details表中?请注意,"已保存,未获取"和"未保存,未获取"是两个问题。

您能否在@ManyToOne中添加fetch = FetchType.EAGER@OneToMany注释以确保它们被急切地获取?

此外,它与您的问题无关,但通常禁止将复数形式作为表名,例如products.

最新更新