2

我有两个实体:项目、员工

  • 员工有主键 {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

4

2 回答 2

3

请注意,Employee 没有指向 Project 的指针。此处不能使用典型的 mappedBy 构造。

无论如何,这无关紧要。

事实上,所有ManyToMany的关系都需要一个JoinTable. JoinTable是使用@JoinTable隐式或显式定义的。

@Entity
public class Project {
    @Id
    @Column(name="PROJECTID")
    private Long projectId;

    @ManyToMany
    @JoinTable(
        name="PROJECT_EMPLOYEE",
        joinColumns={@JoinColumn(name="PROJECT_PROJECTID", referencedColumnName="PROJECTID")},
        inverseJoinColumns={@JoinColumn(name="EMPLOYEE_EMPLOYEEID", referencedColumnName="EMPLOYEEID")})
    private Collection<Employee> employees;
    ...
}

如果您只需要reads支持,您可以尝试PROJECT表本身定义为(我什至不确定它是否会正常工作),但这不适用于writesJoinTable

换句话说,我会坚持使用常规构造来表示数据库中的多对多关系,即使用连接表。

于 2010-08-28T01:32:17.017 回答
0

鉴于您提供的类文件,您可能正在尝试将n - m关系更改为n - 0..1关系。

这可以通过删除并通过添加表来EmployeesAssignedToProjects非规范化表来完成:EmployeeprojectId (FK)

Employee
----------
employeeId (PK)
projectId (FK)
name

Project
----------
projectId (PK)

这是你真正想要的吗?我不推荐它。

于 2010-08-27T21:37:41.830 回答