我正在开发一个提供REST服务的简单Spring Boot应用程序,以允许客户端登录和订购某些产品。

在我的MySQL数据库中,有以下表格:

客户
卖方

产品
订购

用户可以选择多个产品,将它们添加到购物车中,然后单击“继续进行结帐”。
在这部分之前,一切都很完美,但是现在我不确定如何进行。

我将仅包含关系部分,以使您对我的代码有更清晰的了解:

对于产品模型类:

@JoinColumn(name = "shop_id", nullable = false)
@ManyToOne(fetch = FetchType.LAZY)
@OnDelete(action = OnDeleteAction.CASCADE)
@JsonIgnore
private Shop shop;

@JoinColumn(name = "order_id", nullable = false)
@ManyToOne(fetch = FetchType.LAZY)
@OnDelete(action = OnDeleteAction.CASCADE)
@JsonIgnore
private Order order;

对于订单模型类:
@JoinColumn(name = "user_id", nullable = false)
@ManyToOne(fetch = FetchType.LAZY)
@OnDelete(action = OnDeleteAction.CASCADE)
@JsonIgnore
private User user;

@JoinColumn(name = "shop_id", nullable = false)
@ManyToOne(fetch = FetchType.LAZY)
@OnDelete(action = OnDeleteAction.CASCADE)
@JsonIgnore
private Shop shop;

对于商店模型类:
@JoinColumn(name = "user_id", nullable = false)
@ManyToOne(fetch = FetchType.LAZY)
@OnDelete(action = OnDeleteAction.CASCADE)
@JsonIgnore
private User user;

现在,我需要进行一个REST POST调用,以创建一个订单,这些是可以考虑的解决方案,但是我不确定它们中的任何一个是否正确:

第一个解决方案:
  • 我创建一个名为“ordred_products”的新表
  • 当用户下订单时,我发送一个POST请求来创建订单,然后我发出一个POST请求来创建一个“ordered_products”元素,该元素将已订购的产品作为一个Set,但是我不知道如何映射它们。

  • 第二种解决方案:
  • 我只保留订单表,并向其中添加一组订购产品。

  • 我会很感激的是有人可以向我解释正确的方法,因为我只是在学习REST和实体之间的关系。

    非常感谢。

    最佳答案

    通常如何使用line_items实现订单。订单有多个line_items。每个line_item应该具有Product表中的product_id,数量和Order表中的order_id。

      +------------+       +-----------------+        +---------------+
      |   Order    |       |    Line_Item    |        |    Product    |
      +------------+       +-----------------+        +---------------+
      | id         |       | id              |        | id            |
      | date       |       | quantity        |        | name          |
      | paid       |       | price           |        | description   |
      +------------+       | product_id      |        +---------------+
                           | order_id        |
                           +-----------------+
    

    因此,Line_item表与产品具有多对一关系,与订单具有多对一关系。

    当用户将商品添加到购物车时,将创建一个新的line_item。通过此设置,可以轻松地从订单导航到产品。所有line_items与Order紧密耦合,并且在删除Order时应级联删除。只需删除与该订单关联的所有line_items,即可轻松清除该订单。

    在代码中,它看起来像

    class Order {
        @Id
        long id;
        Date date;
        boolean paid;
    
        @OneToMany
        List<LineItem> lineItems;
    }
    
    class LineItem {
        @Id
        long id;
        int quantity;
    
        @ManyToOne
        Order order;
    
        @ManyToOne
        Product product;
    }
    
    class Product {
        @Id
        long id;
        String name;
        String description;
        BigDecimal price;
    
        // Product does not need
        // to know about line_items
    }
    

    这是我之前实现购物应用程序的方式

    有一个购物车和订单的概念。两者是不同的,但包含的信息几乎相同。这似乎是多余的,但我觉得这是代表现实的最干净的方法。用户只能拥有一个购物车,但可以有多个订单。当用户结帐时,来自购物车的所有信息都将转移到新的Order中,并清除购物车。

    实体
    Order       Order_Item      Product      Shopping_Cart     Cart_Item
    -----       ----------      -------      -------------     ---------
    id          id              id           id                id
    date        quantity        name         user_id           quantity
    user_id     product_id      description                    product_id
                order_id        price                          cart_id
    

    您可以看到Order和Order_Item与Shopping_Cart和Cart_Item相似。用户开始购物时,将为其初始化购物车。当他们将产品添加到购物车时,将创建与Shopping_Cart相关联的Cart_Items。当用户签出时,将创建一个订单,并将Shopping_Cart数据传输到该订单,并且所有Cart_Items都将传输到与该订单关联的Order_Items。然后,只需删除所有Cart_Item,即可清除Shopping_Cart。

    07-24 09:46
    查看更多