如何使用共享主键从 2 方映射 ManyToOne 关系

How to Map a ManyToOne relationship from 2 sides with shared primary key

我有 3 个 table:员工、归责和任务。

  1. 每个员工可能有很多归责,归属一个归属 一次只给一名员工(多对一关系)
  2. 列出每个任务可能有多个插补,一个插补一次只能属于一个任务(多对一关系
  3. 我希望插补 table 的 TASK_ID 作为其 PRIMARY_KEY

这是我的 3 个实体:

@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
@Table(name="employee")
public class AppUser {

    @Id @GeneratedValue(strategy = IDENTITY)
    private Integer id;
    private String first_name;
    private String last_name;
  @OneToMany(mappedBy="employee")
    private List<Imputation> imputations;
}

@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Imputation {
  
    @Id
    private String id; //something needs to be done here to have the id = task_id

    private LocalDate day;
    private Double workload;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name= "employee_id")
    private AppUser employee;
}

@Data
@Entity
@NoArgsConstructor
@AllArgsConstructor

public class Task {
    @Id
    @GeneratedValue(strategy = SEQUENCE)
    private Long id;

    private String name;
    private String description;

    @OneToMany(mappedBy = "task")
    private List<Imputation> imputations;

}

这就是我希望我的 table 插补看起来像的样子(正如我所说,task_id 是一个主键和一个外键):

task_id | day | workload |employee_id

尝试:

@Entity
public class Imputation {
  
    @Id
    @OneToOne
    @JoinColumn(name= "task_id")
    private Task task;

    private LocalDate day;
    private Double workload;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name= "employee_id")
    private AppUser employee;
}

或者如果你想在实体中保留一个字符串属性:

@Entity
public class Imputation {
  
    @Id
    private String id;

    @MapsId
    @OneToOne
    @JoinColumn(name= "task_id")
    private Task task;

    private LocalDate day;
    private Double workload;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name= "employee_id")
    private AppUser employee;
}