我正在开发一个提供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调用,创建一个订单,这些是可以考虑的解决方案,但是我不确定它们中的任何一个是否正确:
第一个解决方案:
第二个解决方案:
我会很感激的是有人可以向我解释正确的方法,因为我只是在学习REST和实体之间的关系。
非常感谢您。
答案 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。