微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何创建连接在一起的 OneToOne 和 OneToMany

如何解决如何创建连接在一起的 OneToOne 和 OneToMany

我来自前端,所以这一切对我来说都是新的。我有以下实体 ClientCartProduct,它们之间是这样连接的:

  1. Client @OnetoOne Cart
  2. Cart => @OnetoMany => Product(@ManyToOne for Cart)

运行我的 SpringDataJpaApplication 正确创建了我的所有 3 个表,其中包含 Postgres 中的所有相应列及其外键。使用所有字段创建一个新的 Cart,将在 Postgres 中创建 ClientCart,但不会创建 Product,它是一个 @ManyToOne .查询数据库将为 Product

生成空字段
// Client
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Entity
public class Client {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int client_id;

private String name;
private String lastName;

@OnetoOne(mappedBy = "client")
private Cart cart;
}


// Cart
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Entity
public class Cart {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int cart_id;

@OnetoMany(mappedBy = "cart")
private List<Product> productList;


@OnetoOne(cascade = CascadeType.ALL)
@JoinColumn(name = "fk_client_id",referencedColumnName = "client_id")
    private Client client;
}


//Product
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Entity
public class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int product_id;
    private String productName;
    private int price;
    private int qty;

    @ManyToOne
    @JoinColumn(name = "fk_cart_id")
    private Cart cart;
}


// CartController
@RestController
    public class CartController {

        @Autowired
        CartRepository cartRepository;

        @PostMapping("/createCart")
        public Cart createCart(@RequestBody Cart request) {
            return cartRepository.save(request);
        }
}

如前所述,发布到端点会返回一个 200,其中包含仅为 ClientCart 创建的记录(如上所述)。 post请求如下:

{
  "productList": [
    {
      "productName": "mobile","price": 800,"qty": 2
    }
  ],"client": {
    "name": "John","lastName": "Done"
  }
}

我做错了什么?为什么没有填充 Product 表? (注意:@OnetoMany@ManyToOne 之间只有 CartProduct 我能够填充它们,但是当 {{ 1}} 被混为一谈,我有上面描述的问题)

解决方法

拥有实体的概念是您所缺少的。

在您拥有的 Cart 实体中:

@OneToMany(mappedBy = "cart")
private List<Product> productList;

这表示 Product 实体拥有该关系。只有拥有关系的实体才能持久化关系。这意味着 Product 可以持久化 Cart,但反之则不然。简而言之,您必须自己坚持 Product。所以,保存购物车,然后在产品中设置购物车,然后保存产品。

如果您没有它,那么 @ManyToOne 本身决定了相同的操作过程。

@ManyToOne
@JoinColumn(name = "fk_cart_id")
private Cart cart;

productList 应被视为仅查询字段。

请注意,您可以在 Cascade 中使用 Cart 注释玩游戏,但我不建议这样做。这是一个有点复杂和令人烦恼的注释。不要在您的 Repository 层中使用 Controller,而是创建一个 @Service 层并将持久化、检索和其他业务逻辑放在那里,并将其包含在您的控制器中。标准模式。

然后为您的服务层编写 junit/mockito 测试用例。

编辑:需要明确的是,Product 不能持久化 Cart,而是必须将之前持久化的 Cart 设置为购物车字段。 Cart 实体没有这样的要求。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。