2010-08-27 28 views
1

我有两个实体:项目,员工许多一对多的单向映射,并且只使用两个表

  • 员工都有主键{雇员} +其他一些属性
  • 项目有主键{专案编号}

代码:

public class Employee { 
    Long employeeId; 
    String name;  
} 
public class Project { 
    Long projectId; 
    Collection<Employee> employees; 
} 

员工和项目是一个单向许多一对多的关系。一般的方法是有三个表:Employee,Project,EmployeesAssignedToProjects。

Employee 
---------- 
employeeId (PK) 
name 

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

EmployeesAssignedToProjects 
---------------------------- 
projectId (FK) 
employeeId (FK) 
{projectId,employeeId} (PK) 

由于Project没有除id以外的其他属性,因此Project表并不是真的必要。这带来了这个多对多关系在Project本质上映射到EmployeesAssignedToProjects时应如何映射的问题。

请注意员工没有指向项目的指针。典型的mappedBy构造不能在这里使用。

[ - 更新 - ]

的问题是更复杂一点:两个项目和员工都组合键。

  • 项目的关键是{companyId,专案编号}
  • 员工的关键是{companyId,雇员}

我采用了3台成立。表PROJECT_EMPLOYEE有3列:companyId,employeeId,projectId。

<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柱:我在XML映射companyId

回答

3

请注意员工没有指向项目的指针。典型的mappedBy构造不能在这里使用。

无论如何这是无关紧要的。

事实是,所有ManyToMany关系都需要JoinTableJoinTable是使用@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; 
    ... 
} 

你可以尝试定义PROJECT表本身为JoinTable如果你只需要读取支持(我甚至不能确定它会正常工作),但是这不会对工作写

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

+0

感谢帕斯卡,请参阅[更新]。 – 2010-08-28 04:01:11

+0

@康迪不客气。但是,请将*新*问题作为新问题发布。将它链接到这一个,如果你想,但你的更新是一个不同的问题和问题,即使相关。请不要在单个问题中混合问题。我不会在这里回答。 – 2010-08-28 04:06:03

+0

是否有可能将@JoinColumn(name =“EMPLOYEE_EMPLOYEEID”.. ..映射到employe表上的另一个唯一键?我无法做到这一点。我想要一个字符串唯一约束来显示而不是整数 – momomo 2015-08-08 09:40:15

0

给你提供你可能是类文件试图改变n - m关系到n - 0..1的关系。

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

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

这是你真正想要的:

这可以通过删除EmployeesAssignedToProjects和非规范化的Employee表加入projectId (FK)它做什么?我不推荐它。

+0

我不想反规范Employee表。谢谢。 – 2010-08-27 22:43:29