JPA:确保子实体归实体的父实体所有

时间:2017-12-22 13:55:52

标签: hibernate jpa

所以,假设你有

class Employee {
 @ManyToOne
 @JoinColumn
 private Department department;
}

class Department {


}

class EmployeeGroup {

   @OneToMany
   @JoinTable
   private Set<Employee> employees;

   @ManyToOne
   @JoinColumn
   private Department department;
}

您如何确保来自特定组的所有员工来自与EmployeeGroup部门相同的部门?

我在@JoinColumn内尝试使用@JoinTable数组...但似乎hibernate无法在链接表中共享两个外键中fk_department_id的相同列。

我期望获得的是:包含三列的链接表,fk_group_id,fk_employee_id,fk_department_id和2 FK(department_id,employee_Id)到employee表,(department_id,group_id)到emp_group表。

没有ComplexPK可以吗?

业务案例:您有两个部门,IT和财务部门,3个部门,Java Group和.NET group,属于IT部门,HR部门属于财务部门。你有5名员工。所有这些都在IT部门,其中两个也在Java组,其中两个在.NET组,其中一个是实习成员,它不属于任何组,但它在同一个部门。现在我想确保当您从IT部门雇用1名员工并说出employee.getGroups()时,所有这些人员也都是IT组,并且该集合不会意外地包含HR组。

3 个答案:

答案 0 :(得分:1)

  

您如何确保来自特定组的所有员工来自与EmployeeGroup部门相同的部门?

如果您想在Hibernate / JPA级别中进行此限制,这也是您需要使用复合主键进行此限制的数据库级别,则主键将同时包含{{1每个DepartmentPK都有EmployeeGroupPK

  

没有ComplexPK可以吗?

简短回答是,因为只有复合主键可以在Employee之前的所有方面提供这些限制。

否则,您将保持映射不变,并在业务级别中进行这些限制。

答案 1 :(得分:0)

在这种特殊情况下,为什么要在员工和部门课程之间建立关系?(我不认为这也是一个很好的规范化设计)

为什么不指定下面提到的关系:  1. EmployeeGroup中与Employeee的一对多关系  2. EmployeeGroup与Department的多对一关系  3.员工与EmployeeGroup中的多对一关系  4.部门与EmployeeGroup的一对多关系

通过这种方式,您可以通过其员工组派生员工的部门,并确保属于同一员工组的员工属于同一部门。

答案 2 :(得分:0)

  

您如何确保来自特定群体的所有员工都是   来自与EmployeeGroup部门相同的部门?

您可以通过建立与Employee关联的EmployeeGroupDepartment之间的关系并删除Department<-->Employee关联来确保{{1} } Department属于,您应该浏览Employee关联。

  

因此,当员工不在任何组中时,您会怎么猜?   部?

您可以使用每个EmplpoyeeGroup的默认组来解决此问题,因此每个不受组影响的Department必须属于他的Employee默认值组,所以你的映射将是:

Department

此解决方案可能会删除public class Employee{ @ManyToOne(optional = false) @JoinColumn(name = "EmployeeGroup_id") private EmployeeGroup employeeGroup; ... } public class Department{ @OneToMany(mappedBy = "department") private List<EmployeeGroup> employeeGroup; @OneToOne(optional = false, orphanRemoval = true, cascade = CascadeType.ALL) @JoinColumn(name = "DefaultEmployeeGroup_id") private EmployeeGroup defaultEmployeeGroup; ... } class EmployeeGroup { @OneToMany(mappedBy = "employeeGroup") private Set<Employee> employees; @ManyToOne(optional = false) @JoinColumn(name ="department"_id) private Department department; ... } Employee之间的冗余关联,并会在数据库端强制执行业务规则。

第二个解决方案:

通过查看Department中的EmployeeDepartment,检查代码中setDepartment(Department)&#39}和setEmployeeGroup(EmployeeGroup)之间的完整性类。 这里不会在数据库层中检查业务规则(如果其他应用程序使用相同的数据库)。

注意:

  • 为了简单起见,我不会prefer a composite primary key,除非我没有选择。
  • 我不认为it's a good idea使用Employee @JoinTable用于@OneToMany字段,Hibernate会为EmployeeGroup.employees关联创建一个单独的表。

希望它有所帮助。