首页 > 解决方案 > 如何为具有复合键的表编写 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 的新手。如果有人可以在这里帮助我,我将不胜感激。谢谢

标签: spring-bootjpajava-8spring-data-jpa

解决方案


Product就 JPA 而言,这两个实体Employee没有任何联系。因此,您无法通过单个存储库访问两者。

例如,Product如果对 an 有实际引用,Employee您可以使用 aProductRepository加载Products 并从那里导航到引用Employee的 s。

但即使这可能是可行的,我猜想Product并且Employee应该被视为不同的聚合,因此,每个都应该有自己的存储库。请参阅您是否应该在 JPA 中的每个表都有一个存储库?有关该问题的更多信息。

鉴于实体,您的存储库看起来很好。请注意,由于使用了String productId而不是,实体看起来确实不典型Product product


推荐阅读