【问题标题】:Hibernate updating child entries in one to many MappingHibernate 在一对多映射中更新子条目
【发布时间】:2020-05-03 10:37:05
【问题描述】:

我有一个

  1. 公司表

  2. 部门表

  3. 员工表。

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

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;
}

【问题讨论】:

    标签: java hibernate spring-boot jpa


    【解决方案1】:

    映射似乎正确,您需要使用 merge 获取 Hibernate 管理的实体并从分离的实例(来自 REST api)复制字段:

    Company c = (Company) session.merge(companyFromDto);
    

    Merge 应注意创建新公司,或更新现有公司(取决于它是否已在数据库中)以及级联关联。

    【讨论】:

    • 我正在使用 @transactional 并在此交易中获取公司 ID。我在事务下更新这个对象,而不是调用 session.update() 方法。我使用了级联。合并,但是没有用。
    【解决方案2】:
    1. 确保您的 JSON 包含 companyId/departmentID/employeeId
    2. 按 companyId 加载公司
    3. departmentID == 0 处插入所有部门条目,并获取生成的 ID(Hibernate 将更新 POJO,或返回具有 ID 集的新 POJO)
    4. 更新所有departmentID &gt; 0 所在的部门条目,并记住使用的部门ID
    5. 迭代 company.getDepartments()iterator.remove() 条目,其中没有包含在从 (3) 和 (4) 构建的集合中的部门 ID
    6. 通过持久化company Hibernate 将检测哪些部门被删除,并删除那些

    对部门做基本相同->员工关系

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-26
      • 1970-01-01
      • 2015-06-19
      • 1970-01-01
      • 2017-06-24
      • 1970-01-01
      • 1970-01-01
      • 2014-03-29
      相关资源
      最近更新 更多