Я хотел бы задать теоретический вопрос. Итак, давайте предположим, что я использую 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);
}
И внешний ключ не вставляется в БД, если контроллер вызывается со следующим блоком данных:
{
"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);
});
Так, например, каковы лучшие практики для сохранения данных, поступающих с внешнего интерфейса?