【问题标题】:Spring Boot - Hibernate - OneToMany - foreign keySpring Boot - Hibernate - OneToMany - 外键
【发布时间】: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


【解决方案1】:

通过避免将数据访问层与 Web 层耦合来保持系统的正交性。在您的 Web 层和域层之间使用 dto 以保持良好的解耦。 是的,对于双向 oneToMany,您必须设置关系的两侧才能使其工作。 最好的方法是将ManyToOne 端设置到OneToMany 端设置器或构造器中。

因此,当添加产品时,您设置product.basket(this);

【讨论】:

  • 感谢您的帮助,我会修改实现。
猜你喜欢
  • 1970-01-01
  • 2018-12-16
  • 2015-01-25
  • 2015-07-02
  • 2020-05-17
  • 2011-03-19
  • 1970-01-01
  • 1970-01-01
  • 2017-03-08
相关资源
最近更新 更多