【问题标题】:How to specify a Composite Primary Key while defining a Custom Interface as a JpaRepository?如何在将自定义接口定义为 JpaRepository 时指定复合主键?
【发布时间】:2020-09-17 18:59:45
【问题描述】:

我有两个具有以下属性的实体类:

class Parent {
    @Id
    string columnA;

    string columnB;
}

class Child {
    //confused here: ManyToOne with Parent class

    string columnC;
    string columnD;
}

我想要如下的 SQL 表:

  1. 父级(A列(主键),B列)
  2. 子级(A列(外键),C列,D列)其中,
    • 主键 = (columnA, columnC) and,
    • (子 -> 多对一 -> 父)关系。

问题 1:如何为 Child 创建正确的 Entity 类?

问题2:我想要一个扩展JpaRepository 的childRepository 接口。我一头雾水,如何指定复合主键?

public interface childRepository extends JpaRepository<Child, 'What to write here?'>{
}

【问题讨论】:

    标签: java spring spring-boot jpa spring-data-jpa


    【解决方案1】:

    问题 1:这取决于您的业务逻辑。
    问题2:创建新类以存储子实体的ID

    @Embeddable
    public class ChildId implements Serializable{
    
       private String columnA;
       private String columnC;
    
       // getters and setters
    }
    

    在您的孩子班级中:

    @EmbeddedId
    private ChildId childId;
    
    @MapsId(value = "columnA")
    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "columnA")
    private Parent parent;
    

    在您的 ChildRepository 中:

    public interface ChildRepository extends JpaRepository<Child, ChildId>{}
    

    PS:你可以根据业务逻辑应用其他方式

    【讨论】:

    • 每当我保存父实体时,子实体也应该被保存。此外,每当我获取父实体时,子实体也应该存在于其中。这可能吗?
    • 1.在@OneToMany(cascade = CascadeType.ALL) 中的父实体端使用级联(搜索其他级联类型:持久、合并、分离、刷新、删除) 2. 为此目的使用渴望获取。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-29
    • 2011-09-18
    • 2014-06-27
    • 2010-11-09
    • 2020-05-02
    • 2011-06-05
    • 1970-01-01
    相关资源
    最近更新 更多