首页 > 解决方案 > JPA Mapping 发出一张带有多个表的表

问题描述

我有一个用于管理审批的表格,我不想添加更多附加列作为对其的引用

审批.java

@Entity
@Table
public  class Approval {
  @Id
  private int id;
  @Column
  private int doc_key; 
  @Column
  private int stage; 
  @Column
  private int status; 
  //getter and setter
}

我有两种需要批准的文件 RFQ 和合同

询价单.java

@Entity
@Table
public  class RFQ {
  @Id
  private int id;

  @Column
  private int status; 

  @OneToMany(mappedBy = "dockey" , fetch=FetchType.LAZY ,cascade = CascadeType.ALL)
  private List<Approval> approvallist; 

}

合同.java

@Entity
@Table
public  class Contract {
     @Id
      private int id;

     @Column
      private int status; 

      @OneToMany(mappedBy = "dockey" , fetch=FetchType.LAZY ,cascade = CascadeType.ALL)
      private List<Approval> approvallist; 


}

如您所见,我正在使用此关联映射:

@OneToMany(mappedBy = "dockey" , fetch=FetchType.LAZY ,cascade = CascadeType.ALL)

但除非我有文档类 RFQ 或合同之一,否则它不起作用如果我想添加另一个文档,如 Porposal foe 示例

标签: jpa

解决方案


考虑到数据库的观点,可以使用多种可能性对您想要的情况进行建模:

  1. 创建一个Document包含一对多关系的(抽象)基类,并让两种特定的文档类型都继承自它——因此您最终会得到一个被doc_key列引用的文档表。

  2. 使用专用表映射特定文档类型和批准之间的关系,以便每个特定文档类型包含与 a 的一对多关系,例如RFQApproval,包含IDof theRFQIDof theApproval并且您doc_key从 中删除 the Approval

我个人的偏好是1,因为这体现了“每个审批链接到一个文档”和“RFQ和合同都是文档”的面向对象思维的思想。


推荐阅读