在Spring应用程序中将产品链接到订单的最佳方法是什么?

时间:2018-08-26 21:48:49

标签: java spring hibernate rest entity-relationship

我正在开发一个提供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和实体之间的关系。

非常感谢您。

1 个答案:

答案 0 :(得分:1)

通常使用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_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。