我有一个公司表,部门表和员工表。我正在使用休眠将数据持久存储在数据库中。一个公司可以有多个部门,一个部门可以有多个员工。我已经完成了对应的一对多实体映射,如下面的代码所述。来自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;
}
映射似乎是正确的,您需要使用merge
获得一个Hibernate管理的实体,并从分离的实例(来自REST api)中复制字段:
Company c = (Company) session.merge(companyFromDto);
合并应注意创建新公司,或更新现有公司(取决于公司是否已存在于数据库中,以及级联关联。