Spring Boot - Hibernate - OneToMany - внешний ключ - PullRequest
0 голосов
/ 18 апреля 2020

Я хотел бы задать теоретический вопрос. Итак, давайте предположим, что я использую 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);
        }); 

Так, например, каковы лучшие практики для сохранения данных, поступающих с внешнего интерфейса?

1 Ответ

1 голос
/ 18 апреля 2020

Сохраняйте ортогональность в вашей системе, избегая соединения вашего уровня доступа к данным с веб-уровнем. Используйте dto между вашим веб-сайтом и доменным слоем, чтобы все было хорошо развязано. И да, для двунаправленного oneToMany вы должны установить две стороны отношения, чтобы оно работало. Лучший способ - установить сторону ManyToOne в установщик или конструктор стороны OneToMany.

И поэтому при добавлении продукта вы устанавливаете product.basket(this);.

...