所以,假设你有
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组。
答案 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
关联的EmployeeGroup
和Department
之间的关系并删除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
中的Employee
和Department
,检查代码中setDepartment(Department)
&#39}和setEmployeeGroup(EmployeeGroup)
之间的完整性类。
这里不会在数据库层中检查业务规则(如果其他应用程序使用相同的数据库)。
注意:强>
Employee
@JoinTable
用于@OneToMany
字段,Hibernate会为EmployeeGroup.employees
关联创建一个单独的表。 希望它有所帮助。