java - 如何创建所有链接在一起的 OneToOne 和 OneToMany
问题描述
我来自前端,所以这一切对我来说都是新的。我有以下实体Client
, Cart
,Product
它们之间是这样连接的:
Client
<=>@OneToOne
<=>Cart
Cart
=>@OneToMany
=>Product
(@ManyToOne
为Cart
)
运行 mySpringDataJpaApplication
在 Postgres 中正确创建了我的所有 3 个表,其中包含所有相应的列及其外键。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
{
"productList": [
{
"productName": "mobile",
"price": 800,
"qty": 2
}
],
"client": {
"name": "John",
"lastName": "Done"
}
}
我究竟做错了什么?为什么没有Product
填充表格?(注意:只有@OneToMany
和@ManyToOne
之间Cart
,Product
我可以同时填充它们,但是当Client
混合在一起时,我遇到了上面描述的问题)
解决方案
拥有实体的概念是您所缺少的。
在Cart
您拥有的实体中:
@OneToMany(mappedBy = "cart")
private List<Product> productList;
这表示该Product
实体拥有该关系。只有拥有关系的实体才能保持关系。这意味着 aProduct
可以坚持 aCart
但反之则不行。总之,你要坚持一个Product
自己。所以,保存购物车,然后在产品中设置购物车,然后保存产品。
如果您没有它,那么它@ManyToOne
本身就决定了相同的行动方案。
@ManyToOne
@JoinColumn(name = "fk_cart_id")
private Cart cart;
应被productList
视为仅查询字段。
请注意,您可以玩带有Cascade
注释的游戏,Cart
但我不建议这样做。这是一个有点复杂和令人烦恼的注释。与其Repository
在您的Controller
层中创建一个层,不如创建一个@Service
层并将持久化、检索和其他业务逻辑放入其中,并将其包含在您的控制器中。标准模式。
然后为您的服务层编写 junit/mockito 测试用例。
编辑:为了清楚起见, aProduct
不能持久化 a Cart
,而是必须有一个先前持久化Cart
的设置到购物车字段。Cart
对实体没有这样的要求。
推荐阅读
- android - java.lang.ClassNotFoundException:找不到类“android.support.v4.app.CoreComponentFactory”
- google-tag-manager - Google 跟踪代码管理器未在预览模式下记录点击
- php - 我可以将 SELECT 查询放入 MySQL 中的 IF 语句中吗?
- ios - 推送到 tabBar 时隐藏视图 - swift
- typo3 - 具有动态 uid 的 TYPO3 MenuProcessor
- java - java 8中每种Base64的用途和用例
- discord.js - Discord 机器人角色命令因未知原因停止工作
- python - 使用 Selenium 自动化时,还有其他方法可以处理 Chrome 的打印预览窗口吗?
- powershell - 如何使用 powershell 使用 double if 语句?
- javascript - 回调不更新状态