我有两个实体:项目、员工
- 员工有主键 {employeeId} + 一些其他属性
- 项目有主键 {projectId}
代码:
public class Employee {
Long employeeId;
String name;
}
public class Project {
Long projectId;
Collection<Employee> employees;
}
Employee 和 Project 是一种单向多对多的关系。一般的做法是拥有三个表:Employee、Project、EmployeesAssignedToProjects。
Employee
----------
employeeId (PK)
name
Project
----------
projectId (PK)
EmployeesAssignedToProjects
----------------------------
projectId (FK)
employeeId (FK)
{projectId,employeeId} (PK)
由于 Project 除了 id 之外没有其他属性,所以 Project 表并不是真正需要的。这带来了一个问题,即既然 Project 本质上映射到EmployeesAssignedToProjects,那么应该如何映射这种多对多关系。
请注意,Employee 没有指向 Project 的指针。此处不能使用典型的 mappedBy 构造。
[ - 更新 - ]
问题有点复杂:Project 和 Employee 都有复合键。
- 项目的键是 {companyId,projectId}
- 员工的密钥是 {companyId,employeeId}
我采用了 3 张桌子的设置。表 PROJECT_EMPLOYEE 有 3 列:companyId、employeeId、projectId。我在xml中映射:
<many-to-many name="PROJECT" >
<join-table name="PROJECT_EMPLOYEE">
<join-column name="companyId" referenced-column-name="companyId"/>
<join-column name="employeeId" referenced-column-name="employeeId" />
<inverse-join-column name="companyId" referenced-column-name="companyId" />
<inverse-join-column name="projectId" referenced-column-name="projectId" />
</join-table>
</many-to-many>
我收到一个错误,抱怨 companyId 出现多次:集合映射中的重复列:Project.employees 列:companyId