Java 如何创建链接在一起的OneToOne和OneToMany
我来自前端,所以所有这些对我来说都是新的。我拥有以下实体Java 如何创建链接在一起的OneToOne和OneToMany,java,spring,hibernate,spring-data-jpa,Java,Spring,Hibernate,Spring Data Jpa,我来自前端,所以所有这些对我来说都是新的。我拥有以下实体客户,购物车,产品,它们之间相互连接: 客户端@OneToOne购物车 购物车=>@OneToMany=>产品(@ManyToOne用于购物车) 运行mySpringDataJPA应用程序可以正确创建所有my 3表,其中包含Postgres中的所有列及其外键。使用所有字段创建新的购物车,将在Postgres中创建客户端和购物车,但不会创建产品,它是@ManyToOne。查询数据库将为产品 // Client @Data @AllArgsCo
客户
,购物车
,产品
,它们之间相互连接:
客户端
@OneToOne
购物车
购物车
=>@OneToMany
=>产品
(@ManyToOne
用于购物车
)SpringDataJPA应用程序
可以正确创建所有my 3表,其中包含Postgres中的所有列及其外键。使用所有字段创建新的购物车
,将在Postgres中创建客户端
和购物车
,但不会创建产品
,它是@ManyToOne
。查询数据库将为产品
// 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);
}
}
我做错了什么?为什么不填充产品表?
(注意:在购物车
和产品
之间只有@OneToMany
和@ManyToOne
,我可以同时填充这两个,但是当客户
加入到组合中时,我有上面描述的问题)拥有实体的概念就是你所缺少的
在购物车
实体中,您有:
@OneToMany(mappedBy = "cart")
private List<Product> productList;
productList
应视为仅查询字段
请注意,您可以在Cart
中使用Cascade
注释玩游戏,但我不建议这样做。这是一个有点复杂和烦人的注释。不要在控制器
层中有存储库
,而是创建一个@服务
层,将持久化、检索和其他业务逻辑放在其中,并将其包含在控制器中。标准图案
然后为您的服务层编写junit/mockito测试用例
编辑:需要明确的是,产品
不能持久化购物车
,而是必须具有以前持久化的购物车
,才能设置为购物车字段。对购物车实体没有这样的要求。你是对的,我缺少了关系所有权的一部分。您提到产品
拥有该关系。这不是不对吗?这不是购物车吗?我想它看起来倒了,但请注意,在产品中有购物车,但在购物车中有列表。外键是在Product
表中创建的,因此Product
是负责并拥有关系的人。产品表中fk_cart_id列中的值是持久化关系。
@OneToMany(mappedBy = "cart")
private List<Product> productList;
@ManyToOne
@JoinColumn(name = "fk_cart_id")
private Cart cart;