JPA Mapping выпускают одну таблицу с несколькими таблицами - PullRequest
0 голосов
/ 07 января 2020

У меня есть таблица для управления утверждением, и я не хочу добавлять дополнительные столбцы в качестве ссылки на нее

Утверждение. 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 и контракт, которые требуют одобрения

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 или Contract, что если я хочу добавить другой документ, например, Porposal foe

Ответы [ 3 ]

0 голосов
/ 07 января 2020

Использовать JoinColumn, а не mappedBy

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

     @JóinColumn(name="dockey", referenceColumnName="doc_key")
       private List<Approval> approvallist; 

Сделайте то же самое для другой сущности. Я полагаю, что у таблицы aproval есть столбец doc_key и RFQ, а в контракте есть столбец dockey.

0 голосов
/ 07 января 2020

Набор навыков похож на класс одобрения.

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;
}
0 голосов
/ 07 января 2020

С точки зрения базы данных, желаемая ситуация может быть смоделирована с использованием нескольких возможностей:

  1. Создать (абстрактный) базовый класс Document, который содержит отношение один ко многим и пусть оба указанных c типа документов наследуются от него - так что в итоге вы получите таблицу документов, на которую ссылается столбец doc_key.

  2. Сопоставьте связь между спецификациями c типы документов и утверждения с использованием выделенных таблиц, поэтому каждый указанный тип документа c содержит отношение один ко многим, например, RFQApproval, который содержит ID RFQ и ID Approval, и вы удалить doc_key из Approval.

. Моё личное предпочтение - 1, потому что это отражает мысли о том, что «каждое утверждение ссылается на документ» и «ЗКП и контракты являются документами». с точки зрения объектно-ориентированного мышления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...