spring-boot - 如何为具有复合键的表编写 JpaRepository
问题描述
请参阅随附的屏幕截图以了解表结构。
Empd_Id 是“Employee”表中的主键,它又与“product”表中的“product_id”一起成为复合键的一部分。任何员工都可以拥有多个产品,因此在这种情况下,它在“员工-产品”表之间变成“一对多”关系。现在我很困惑是否只需要编写 1 个 JpaRepository 接口,即用于员工或 2 个 JpaRepository 接口(1 个用于员工,另一个用于产品)。我的直觉只是 Employee 表的 1 个界面,但如何???
以下是我的代码片段:- 第一个 JPA 存储库接口
public interface MyRepository extends JpaRepository<Product, EmpProd> {
}
实体:-
@Entity
@Table(name="product")
public class Product{
@EmbeddedId
private EmpProd empProd;
@Column(name="product_name")
private String commerceUserId;
@Column(name="description")
private String description;
对于复合键:-
@Embeddable
public class EmpProd implements Serializable{
private static final long serialVersionUID = 1L;
@NotNull
@Column(name="emp_id")
private String empId;
@NotNull
@Column(name="product_id")
private String productId;
第二个 Jpa 存储库接口
public interface MyMainDataRepository extends JpaRepository<Employee, String> {
}
实体类:-
@Entity
@Table(name="employee")
public class Employee{
@Id
@NotNull
@Column(name="emp_id")
private String empId;
@Column(name="first_name")
private String firstName;
虽然,我已经编写了 2 个独立的 JPA 存储库,但我坚信只需要 1 个,即主要的
公共接口 MyMainDataRepository 扩展 JpaRepository { }
但我不知道关联实体类并使用单个 Jpa 存储库获取数据,因为我是 Spring Data JPA 的新手。如果有人可以在这里帮助我,我将不胜感激。谢谢
解决方案
Product
就 JPA 而言,这两个实体Employee
没有任何联系。因此,您无法通过单个存储库访问两者。
例如,Product
如果对 an 有实际引用,Employee
您可以使用 aProductRepository
加载Product
s 并从那里导航到引用Employee
的 s。
但即使这可能是可行的,我猜想Product
并且Employee
应该被视为不同的聚合,因此,每个都应该有自己的存储库。请参阅您是否应该在 JPA 中的每个表都有一个存储库?有关该问题的更多信息。
鉴于实体,您的存储库看起来很好。请注意,由于使用了String productId
而不是,实体看起来确实不典型Product product
。
推荐阅读
- python - 无法下载frozen_inference_graph.pb
- vue.js - 错误:这可能不是 npm 的问题。上面可能有额外的日志输出
- javascript - 当 URI 的字符超过 5,000 时,如何设置和发送 GET 数据
- python - 如何将不规则的像素网格重新采样为规则网格?
- npm - npm install 始终使用人工注册表并忽略 .npmrc 文件
- macos - 使用快速操作自动更改图像宽度和调整高度
- scala - 从 coursier 安装 scala:`scala` 命令在哪里?
- python - 如何在 Visual Studio 上安装 pyaudio?
- javascript - Chart JS Html Legend Plugin 循环数据
- amazon-web-services - 基于修复条件的 splunk 警报