java - Hibernate 更新一对多映射中的子条目

标签 java hibernate spring-boot jpa

我有一个

  1. 公司表

  2. 部门表

  3. 员工表。

我正在使用 hibernate 将数据保存在数据库中。

<强>1。公司与部门之间的一对多关系。

一家公司可以有多个部门,一个部门可以有多名员工。

我已经完成了相应的一对多实体映射,如下面的代码中所述。更新这些实体的请求来自 JSON 格式的 UI。

我已在请求中提供了公司 ID、部门 ID 和员工 ID。 现在假设对于某一特定公司,数据库中有一个部门的 dept_id 为 3。 。在 Json 请求中,我收到一项请求,要求更新该特定公司的另一个部门。因此,更新后,以前的条目应保持原样,即 ID 为 3 的部门应保持不变,新条目应添加一些部门 ID,例如 4。

现在该公司将有两个部门,一个部门的 ID 为 3,另一个部门的 ID 为 4。

如何实现这一点?..请求中不存在的部门条目也应从数据库中删除...员工和部门之间的关系也是如此,请求可能会要求添加新的特定部门的员工,保留现有员工。

请帮我解决这个问题,必须在我的代码中完成什么配置/方法才能实现此目的。 这是这三个表的代码:

@Entity
@Table(name = "COMPANY")
@Getter
@Setter
public class Company implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "company_id")
    private long companyId;

    @Column(name = "company_region")
    private String companayRegion;

    @Column(name = "company_code")
    private String companyCode;

    @OneToMany(mappedBy = "company", cascade = CascadeType.ALL)
    private List<department> departments;


    public Company() {
    }
}




@Entity
@Table(name = "Department")
@Getter
@Setter
public class Department implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "dept_id")
    private long departmentID;

    @Column(name = "dep_code")
    private String departmentCode;


    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "company_id")
    private Company company;

    @OneToMany(mappedBy = "department", cascade = CascadeType.ALL)
    private List<Employee> employees;
}



@Entity
@Table(name = "Employee")
@Getter
@Setter
public class Employee implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "employee_id")
    private long employeeId;

    @Column(name = "emp_code")
    private String empCode;

    @Column(name = "emp_name")
    private String empname;

    @Column(name = "employee_city")
    private String employeeCity;


    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "dept_id")
    private Department department;
}

最佳答案

  1. 确保您的 JSON 包含companyId/departmentID/employeeId
  2. 按companyId加载公司
  3. 插入所有 departmentID == 0 的部门条目,并获取生成的 ID(Hibernate 将更新 POJO,或返回一个包含 ID 集的新 POJO)
  4. 更新所有 departmentID > 0 的部门条目,并记住使用的部门 ID
  5. 迭代 company.getDepartments()iterator.remove() 条目,其中 DepartmentID 不包含在根据 (3) 和 (4) 构建的集合中
  6. 通过保留公司,Hibernate 将检测哪些部门被删除,并删除这些部门

对部门 -> 员工关系进行基本相同的操作

关于java - Hibernate 更新一对多映射中的子条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59772121/

相关文章:

java - Android对SD卡的写访问

java - Hadoop 2.7 - 在 HDFS 中创建目录的简单 Java 代码

java - Spring Boot - 流式传输 Apache FileUpload - 流意外结束

Spring 启动: Authenticating both a Stateless REST API and a Stateful "Login" Web Controller in the same project?

java - Mapreduce程序只输出一条记录

java - 网络服务+安卓

java - 在java中使用hibernate连接到mysql数据库

java - Grails、作业、静态辅助方法和 Hibernate session

java - 获取两个日期之间有入场记录

java - 如何在java spring中将slf4j与多个类一起使用?