【发布时间】:2021-12-28 16:05:39
【问题描述】:
Department 和 Employee 之间存在多对多关系
作为连接Employee 和Department 类的关系类,我有一个名为DepartmentEmployee 的类,该类有一个@EmbeddableId 作为id,其中包含来自Department 和@ 的主键987654331@,
部门雇员类
@Entity
@Table(name = "dept_emp")
public class DepartmentEmployee {
@EmbeddedId
private DepartmentEmployeeId id;
@JsonIgnore
@MapsId("deptNo")
@JoinColumn(name = "dept_no")
@ManyToOne(fetch = FetchType.LAZY)
private Department department;
@JsonIgnore
@MapsId("empNo")
@JoinColumn(name = "emp_no")
@ManyToOne(fetch = FetchType.LAZY)
private Employee employee;
@Column(name = "from_date")
private LocalDate fromDate;
@Column(name = "to_date")
private LocalDate toDate;
DepartmentEmployee() {
}
public DepartmentEmployee(Department department, Employee employee) {
this.department = department;
this.employee = employee;
this.id = new DepartmentEmployeeId(department.getDeptNo(), employee.getEmpNo());
}
public DepartmentEmployeeId getId() {
return id;
}
public void setId(DepartmentEmployeeId id) {
this.id = id;
}
public Employee getEmployee() {
return employee;
}
public LocalDate getFromDate() {
return fromDate;
}
public void setFromDate(LocalDate fromDate) {
this.fromDate = fromDate;
}
public LocalDate getToDate() {
return toDate;
}
public void setToDate(LocalDate toDate) {
this.toDate = toDate;
}
}
DepartmentEmployeeId 类(嵌入类)
@Embeddable
public class DepartmentEmployeeId implements Serializable {
@Column(name = "dept_no")
private String deptNo;
@Column(name = "emp_no")
private Long empNo;
DepartmentEmployeeId() {
}
public DepartmentEmployeeId(String deptNo, Long empNo) {
this.deptNo = deptNo;
this.empNo = empNo;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass())
return false;
DepartmentEmployeeId that = (DepartmentEmployeeId) o;
return Objects.equals(deptNo, that.deptNo) &&
Objects.equals(empNo, that.empNo);
}
@Override
public int hashCode() {
return Objects.hash(deptNo, empNo);
}
}
部门类
@Entity
@Table(name = "departments")
public class Department {
@Id
@Column(name = "dept_no")
private String deptNo;
@Column(name = "dept_name")
private String deptName;
@JsonIgnore
@OneToMany(cascade = CascadeType.ALL, mappedBy = "department", orphanRemoval = true)
private List<DepartmentEmployee> employees = new ArrayList<>();
public String getDeptNo() {
return deptNo;
}
public void setDeptNo(String deptNo) {
this.deptNo = deptNo;
}
public String getDeptName() {
return deptName;
}
public void setDeptName(String deptName) {
this.deptName = deptName;
}
public void addEmployee(Employee employee, LocalDate fromDate) {
DepartmentEmployee employeeToAdd = new DepartmentEmployee(this, employee);
employeeToAdd.setFromDate(fromDate);
employees.add(employeeToAdd);
}
}
现在在 DepartmentEmployee 类中,我有两个字段,fromDate 和 toDate,fromDate 告诉何时在部门中添加员工,toDate 是告诉员工何时从部门中删除的日期部门,我的问题出在delete 方法上,该方法应该通过DepartmentEmployeeId 找到DepartmentEmployee 并将其toDate 设置为我发送它的任何日期,但我无法使该方法找到@987654344 @by DepartmentEmployeeId
我需要修复的方法在 Department 类中
public void deleteEmployee(Long empNo, LocalDate toDate) {
DepartmentEmployeeId id = new DepartmentEmployeeId(deptNo, empNo);
this.employees.stream().filter(employee -> id.equals(employee.getId())).findAny().orElseThrow(() -> new DepartmentNotFoundException(deptNo)).setToDate(toDate);
}
【问题讨论】:
-
什么不起作用?你没想到会发生什么?
-
该方法抛出 DepartmentNotFoundException 因为它找不到我告诉要查找的 DepartmentEmployee
-
这个方法对我来说似乎没问题,所以这可能是数据问题。
-
id.equals(employee.getId())看起来很奇怪!因为id是DepartmentEmployeeId的一个实例,我假设employee.getId()应该返回String。 -
如果代码如您所说,它应该可以工作。因此,这可能是数据问题,或者您正在检索(出于某种原因)要比较的错误数据。
标签: java json spring-boot arraylist