【问题标题】:How to find an Object on a arraylist by an embeddable id如何通过可嵌入的 id 在数组列表中查找对象
【发布时间】:2021-12-28 16:05:39
【问题描述】:

DepartmentEmployee 之间存在多对多关系

作为连接EmployeeDepartment 类的关系类,我有一个名为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 类中,我有两个字段,fromDatetoDatefromDate 告诉何时在部门中添加员工,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()) 看起来很奇怪!因为idDepartmentEmployeeId 的一个实例,我假设employee.getId() 应该返回String
  • 如果代码如您所说,它应该可以工作。因此,这可能是数据问题,或者您正在检索(出于某种原因)要比较的错误数据。

标签: java json spring-boot arraylist


【解决方案1】:

好的,所以我发现了问题,它不在部门方法中的 deleteEmployee() 处,而是在服务层中的 deleteEmployeeFromDepartment() 方法处,我使用错误的方法来查找部门,因此它是返回一个空的 DepartmentEmployee 列表

从这里:

@Override
    @Transactional
    public void deleteEmployeeFromDepartment(String deptNo, Long empNo, LocalDate toDate) {
        Department department = this.departmentRepository.findById(deptNo).orElseThrow(()-> new DepartmentNotFoundException(deptNo));
        department.deleteEmployee(empNo,toDate);
        this.departmentRepository.save(department);
    }

到这里:

@Override
    @Transactional
    public void deleteEmployeeFromDepartment(String deptNo, Long empNo, LocalDate toDate) {
        Department department = this.departmentRepository.findByIdWithEmployees(deptNo).orElseThrow(()-> new DepartmentNotFoundException(deptNo));
        department.deleteEmployee(empNo,toDate);
        this.departmentRepository.save(department);
    }

【讨论】:

    猜你喜欢
    • 2021-09-04
    • 2022-11-10
    • 2020-02-29
    相关资源
    最近更新 更多