如何解决如何创建连接在一起的 OneToOne 和 OneToMany
我来自前端,所以这一切对我来说都是新的。我有以下实体 Client
、Cart
、Product
,它们之间是这样连接的:
运行我的 SpringDataJpaApplication
正确创建了我的所有 3 个表,其中包含 Postgres 中的所有相应列及其外键。使用所有字段创建一个新的 Cart
,将在 Postgres 中创建 Client
和 Cart
,但不会创建 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
,其中包含仅为 Client
和 Cart
创建的记录(如上所述)。 post请求如下:
{
"productList": [
{
"productName": "mobile","price": 800,"qty": 2
}
],"client": {
"name": "John","lastName": "Done"
}
}
我做错了什么?为什么没有填充 Product
表?
(注意:在 @OnetoMany
和 @ManyToOne
之间只有 Cart
和 Product
我能够填充它们,但是当 {{ 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 举报,一经查实,本站将立刻删除。