2010-08-27 33 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