如何使用共享主键从 2 方映射 ManyToOne 关系
How to Map a ManyToOne relationship from 2 sides with shared primary key
我有 3 个 table:员工、归责和任务。
- 每个员工可能有很多归责,归属一个归属
一次只给一名员工(多对一关系)
- 列出每个任务可能有多个插补,一个插补一次只能属于一个任务(多对一关系
- 我希望插补 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;
}
我有 3 个 table:员工、归责和任务。
- 每个员工可能有很多归责,归属一个归属 一次只给一名员工(多对一关系)
- 列出每个任务可能有多个插补,一个插补一次只能属于一个任务(多对一关系
- 我希望插补 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;
}