JPA映射问题一表多表

JPA映射问题一表多表,jpa,Jpa,我有一个用于管理批准的表,我不想添加更多的列作为对它的引用 Approval.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 } @Entity @Table pub

我有一个用于管理批准的表,我不想添加更多的列作为对它的引用

Approval.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
}
@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; 

}
@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; 


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

RFQ.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
}
@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; 

}
@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; 


}
但它不工作,除非我有一个文件类RFQ或合同
如果我想添加另一个文档,如Porposal foe示例,从数据库的角度考虑,可以使用多种可能性对您所需的情况进行建模:

  • 创建一个(抽象)基类
    Document
    ,该基类包含一对多关系,并让两种特定的文档类型继承自该基类-因此最终会得到一个由
    doc\u key
    列引用的文档表

  • 使用专用表映射特定文档类型和批准之间的关系,以便每个特定文档类型包含一对多关系,例如
    RFQApproval
    ,其中包含
    RFQ
    ID
    批准的
    ID
    ,然后删除
    doc\u键
    批准


  • 我个人的偏好是1,因为这反映了“每个审批链接到一个文档”和“询价和合同都是文档”的面向对象思想。

    使用JoinColumn,而不是mappedBy

       @OneToMany(fetch=FetchType.LAZY ,cascade = CascadeType.ALL)
    
         @JóinColumn(name="dockey", referenceColumnName="doc_key")
           private List<Approval> approvallist; 
    
    @OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL)
    @JóinColumn(name=“dockey”,referenceColumnName=“doc_key”)
    私人名单批准名单;
    

    对其他实体执行相同的操作。我估计审批表有一个doc_key列,RFQ和contract有一个dockey列。

    SkillSet就像一个审批类

    public class Project {
        @Id
        @Column(name = "PROJECT_ID")
        @ColumnPosition(position = 1)
        private Integer projectId;
    
        @OneToMany
        @JoinTable( 
                name = "MAP_PROJECT_SKILL_SET", 
                joinColumns = @JoinColumn(name = "PROJECT_ID"), 
                inverseJoinColumns = @JoinColumn(name = "SKILL_SET_ID"), 
                schema = Constants.DB_SCHEMA_NAME
                ) 
        private List<SkillSet> skillSet= new ArrayList<>();
    }
    
    public class Employee {
        @Id
        @Column(name = "EMPLOYEE_ID")
        @ColumnPosition(position = 1)
        private Integer projectId;
    
        @OneToMany
        @JoinTable( 
                name = "MAP_EMPLOYEE_SKILL_SET", 
                joinColumns = @JoinColumn(name = "EMPLOYEE_ID"), 
                inverseJoinColumns = @JoinColumn(name = "SKILL_SET_ID"), 
                schema = Constants.DB_SCHEMA_NAME
                ) 
        private List<SkillSet> skillSet = new ArrayList<>();
    }
    
    public class SkillSet {
        @Id
        @Column(name = "SKILL_SET_ID")
        @ColumnPosition(position = 1)
        private Integer id;
    }
    
    公共类项目{
    @身份证
    @列(name=“PROJECT\u ID”)
    @列位置(位置=1)
    私有整数投影;
    @独身癖
    @可接合(
    name=“映射项目技能集”,
    joinColumns=@JoinColumn(name=“PROJECT\u ID”),
    inverseJoinColumns=@JoinColumn(name=“SKILL\u SET\u ID”),
    schema=Constants.DB\u schema\u NAME
    ) 
    private List skillSet=new ArrayList();
    }
    公营雇员{
    @身份证
    @列(name=“EMPLOYEE\u ID”)
    @列位置(位置=1)
    私有整数投影;
    @独身癖
    @可接合(
    name=“映射员工技能集”,
    joinColumns=@JoinColumn(name=“EMPLOYEE_ID”),
    inverseJoinColumns=@JoinColumn(name=“SKILL\u SET\u ID”),
    schema=Constants.DB\u schema\u NAME
    ) 
    private List skillSet=new ArrayList();
    }
    公开课技能集{
    @身份证
    @列(name=“SKILL\u SET\u ID”)
    @列位置(位置=1)
    私有整数id;
    }
    
    我喜欢,我会尽力去做