【发布时间】:2020-08-01 05:18:31
【问题描述】:
我想问一个理论问题。因此,假设我正在使用 spring boot 和 hibernate,并且我想保留以下数据结构。
@Entity
@Table(name = "shoppingbasket")
@NoArgsConstructor
@AllArgsConstructor
public class ShoppingBasket {
@Getter
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Getter
@Setter
@Column(name = "userId", unique = true)
private String userId;
@Getter
@Setter
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private List<Product> products;
和
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "product")
public class Product {
@Getter
@Id
@Column(name = "ID")
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Getter
@Setter
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "shoppig_basket_id")
private ShoppingBasket shoppigBasket;
数据来自 ResController:
@PostMapping(value = "add")
@ResponseBody
public ResponseEntity<String> addItemToBasket(@RequestBody ShoppingBasket basket) {
shoppingBasketRepositroy.saveOrUpdateShoppingBasket(basket);
return new ResponseEntity<>("New items has been added to the shopping basket", HttpStatus.OK);
}
如果使用以下数据块调用控制器,则外键未插入 DB:
{
"userId": "user_1",
"products": [
{
"name": "Product name 1",
"description": "Some description",
"brand": "Some brand",
"quantity": "5",
"price": "1111"
}
]
}
填充外键的最佳解决方案是什么。我知道控制器中的这种修改可以解决这个问题,但它看起来像肮脏的黑客,至少对我来说。
basket.getProducts().forEach(product -> {
product.setShoppigBasket(basket);
});
例如,从前端持久化数据的最佳做法是什么?
【问题讨论】:
-
最好使用
DTO。将您的实体转换为DTO。您可以使用的一个库是 MapStruct`。 -
这不是一个肮脏的黑客,这是使用父母来拯救孩子的方式。
-
谢谢你们,明白。我只是想尽量减少迭代。
标签: java hibernate spring-boot spring-mvc