问题描述
我正在学习 Springboot/Hibernate,但在使用 ManyToOne 符号时遇到了一些问题。
我有三个模型:Order、OrderDetail 和 Product。每个订单都有多个订单明细(OneToMany,这很好用),每个订单明细包含一个产品的 ID(产品可以重复,因此应该是多对一)。
发生的情况是,每次我尝试保存订单时,都会创建并保存详细信息,但每个详细信息中的产品(已存在于我的数据库中)都被设置为空。在过去的 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;
//...
}
^ 我试过添加或不添加关系的这一边,没有任何效果;我认为无论如何我都不应该需要它,因为我与我的详细信息的产品而不是我的产品的详细信息进行交互。
这是我对 /orders 的 Postman 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","orderDetailList": [
{
"quantity": 1,"product": null
},{
"quantity": 1,"product": null
}
]
}
请注意,产品为空,但我的产品 ID 1 和 2 确实存在于产品 crud 中。为什么它们没有被保存(或返回)?
非常感谢您抽出宝贵时间。
解决方法
每个 OrderDetail 持有一个 Product 的 id(产品可以重复,因此它应该是 ManyToOne)。
我认为你是对的。 Many orderDetail
到 One product
。
您能否检查数据库以查看product_id
是否插入到order_details
表中?注意“保存,不提取”和“不保存,不提取”是两个问题。
您能否在 fetch = FetchType.EAGER
和 @ManyToOne
注释中添加 @OneToMany
以确保它们能被急切地获取?
此外,它与您的问题无关,但通常禁止将复数形式用作表名,例如 products
。