2010-08-26 67 views
2

我不是100%確定這只是一個Hibernate問題,因爲這可能是一個更抽象的決定,但我會試一試。
由於問題描述有點冗長,我將首先聲明我想要做的是看看我是否可以將實現更改爲更類似於最佳實踐的實現。如何實現與Hibernate的3多對多關係?

我有3個與此問題相關的實體:工作站(ws),員工和組織單位(組織單位)。
員工可以屬於一個組織單位。
一個組織單位可以容納很多員工。
工作站用於顯示組織單位(一般情況下),組織單位和特定員工以及不屬於組織單位的員工的數據。

目前,由於各種原因,不受我控制,我們不使用Hibernate中的實體或通過DB約束之間的任何關聯,但我們只是使用邏輯上充當外鍵的列。
我們目前有一個額外的表,其中有4列:Id,WSId,EmployeeId,OrgUnitId。
這允許WS引用一個orgunit(其中employeeId爲null),一個沒有組織單位(orgunitId爲空)的僱員或者一個僱員和org-unit(其中都不爲空)。

我希望能夠知道:
1.Given一個WS,哪些員工是它下面和組織單位,以及如何(即獨自一人,與員工哪個?)
2。給定一名員工,WS正在監控它。
3.給定一個組織單位,哪個WS正在監視它以及如何(即,單獨與員工?哪個?)
這個問題與表示層有關,因爲它決定了視圖會被生成但是它是一個部分域模型作爲用戶將使用一個接口來操作這些監視映射,因此這些映射是域模型的一部分。

我不確定我所擁有的東西在選項中並不是最不可避免的,我會非常感謝意見和建議。

EDIT從其中一個答案中,我認爲WS並不能清楚地顯示出許多這樣的映射的數據同時在上述類型(組織,僱員等)

回答

1

好的,我不知道如何在數據庫端實現這一點,但這裏是一個實體模型,應該涵蓋你正在談論的關係。

編輯: 這是針對您的意見的新版本。現在每個WorkStation都有n個綁定,每個綁定可以有員工或者orgunit或者兩者都有(使用數據庫約束來確保他們都沒有)。

您也可以訪問綁定每單位部門和每個員工,這將使上述查詢更加容易:

@Entity 
public class OrgUnit{ 

    @OneToMany(mappedBy="orgUnit") 
    private Set<Binding> bindings; 

} 

@Entity 
public class Employee{ 

    @OneToMany(mappedBy="employee") 
    private Set<Binding> bindings; 

} 

@Entity 
public class Binding{ 

    @ManyToOne(optional = true) 
    private Employee employee; 

    @ManyToOne(optional=true) 
    private OrgUnit orgUnit; 

    @ManyToOne(optional=false) 
    private WorkStation owner; 

} 

@Entity 
public class WorkStation{ 

    @OneToMany(mappedBy="owner") 
    private Set<Binding> bindings; 

} 

示例客戶端代碼:

public Set<WorkStation> getWorkstationsPerEmployee(final Employee employee){ 
    final Set<WorkStation> workStations = new HashSet<WorkStation>(); 
    for(final Binding binding : employee.getBindings()){ 
     WorkStation workStation = binding.getOwner(); 
     if(workStation!=null) 
      workStations.add(workStation); 
    } 
    return workStations; 
} 
+0

感謝您的回覆。我不確定在組織/員工中,WS的@OneToOne映射作爲單個組織單位/員工的@OneToOne映射可以被許多WS同時監控。 另外,你的'WorkstationEmployeeBinding'是我想到的,但是如果你從註釋的開頭添加我的輸入,你會看到我還需要'WorkstationOrgUnitBinding'和'OrgUnitEmployeeBinding'來反映所有的多對多。所有這些額外的虛擬類別都不覺得是正確的方向,但我可能會誤解。謝謝。 – Ittai 2010-08-26 13:13:59

+0

@Ittai現在,這裏有一個更簡單但更靈活的解決方案,只有一個綁定類 – 2010-08-26 13:46:47

+0

感謝您的解決方案。我希望有一個「內部」的休眠解決方案,但我想這是必須要做的。再次感謝 – Ittai 2010-08-28 15:32:40

0

聽起來像所有你真正需要的是Employee對OrgUnit的一個可空FK,以及對Employee和OrgUnit的WS的兩個可空FK。要查看哪些WS正在監視員工,只需使用與emp_id列匹配的所有WS。與WS監視OrgUnit一樣,可能會附加規定emp_id爲空或不是(取決於您是否需要單獨處理這些情況)。不知道「病人」的位置,你沒有提供任何細節。

+0

很抱歉的「病人」,我當我添加該行時,它分心了,它應該是員工。我已經糾正了這個問題。我還添加了一個更新,我認爲您錯過了一個問題,因爲您的解決方案忽略了WS可以監視許多此類映射的事實。謝謝。 – Ittai 2010-08-26 13:10:02

+0

在這種情況下,您可能已經有適當的解決方案。可能的更改是刪除虛假的「id」字段,並且只有三部分主鍵(恰好是整個記錄),或者將該表拆分爲單獨的WS-> Emp和WS-> OrgUnit映射,但我不知道這些都是真正的改進(除非關聯表將會非常大,在這種情況下,如果將它分開,它可能會使管理更容易)。 – TMN 2010-08-26 13:25:47

+0

哎呀,忘了這是在休眠,所以你會想保留人工ID。 – TMN 2010-08-26 13:27:15

相關問題