【问题标题】:ManyToOne saves null referenceManyToOne 保存空引用
【发布时间】:2021-04-13 22:07:35
【问题描述】:

我正在学习 Springboot/Hibernate,但在使用 ManyToOne 表示法时遇到了一些问题。

我有三个模型:Order、OrderDetail 和 Product。每个订单都有几个 OrderDetails(OneToMany,这很好用),每个 OrderDetail 都有一个 Product 的 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;

    //...

}

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

这是我对 /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",
    "email": "tsayb@opera.com",
    "tel": "(0351) 48158101",
    "schedule": "21:00",
    "orderDetailList": [
        {
            "quantity": 1,
            "product": null
        },
        {
            "quantity": 1,
            "product": null
        }
    ]
}

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

非常感谢您的宝贵时间。

【问题讨论】:

    标签: spring-boot hibernate many-to-one


    【解决方案1】:

    每个 OrderDetail 都有一个 Product 的 id(产品可以重复,因此应该是 ManyToOne)。

    我认为你是对的。 Many orderDetailOne product

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

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

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

    【讨论】:

    • 感谢您的回答。我正在使用 h2database,所以我不知道是否或如何手动查询它。我会尝试换成 SQL,这样我就可以知道数据是没有被获取还是没有被保存。我也会尝试添加 fetch 类型。还要感谢你关于命名约定的问题,我会马上更正。
    • @pablito.aven 不用担心。参考Spring Boot With H2 Database,网页上有H2 Console的指南。
    猜你喜欢
    • 1970-01-01
    • 2018-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 2015-12-03
    相关资源
    最近更新 更多