Hibernate在一对多映射中更新子条目

问题描述 投票:0回答:1

我有一个公司表,部门表和员工表。我正在使用休眠将数据持久存储在数据库中。一个公司可以有多个部门,一个部门可以有多个员工。我已经完成了对应的一对多实体映射,如下面的代码所述。来自UI的JSON格式请求更新这些实体。

在请求中提供了公司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 hibernate-criteria
1个回答
0
投票

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

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

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

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.