2016-09-30 36 views
0

我是新來的休眠,我正在使用我的第一個項目使用JSF2 +休眠4.3。我認爲我與@ManyToMany關係有問題。休眠和JSF - 乘以行

相關表:表EMPLOYEE_TASK

- EMPLOYEE (id, first_name, last_name,...) 
- TASK (id, title, description,...) 
- EMPLOYEE_TASK (id, employee_id, task_id) 

內容:

ID | EMPLOYEE_ID | TASK_ID 
-------------------------------- 
1 |  9  | 1 
2 |  9  | 2 
3 |  9  | 3 
4 |  7  | 1 
5 |  8  | 2 
6 |  6  | 1 

相關代碼部分:

Employee.java

@ManyToMany(fetch = FetchType.EAGER, mappedBy = "workers") 
private List<Task> myWorkingTasks; 

Task.java

@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    @JoinTable(name = "employee_task", catalog = "employeemanager", joinColumns = { 
     @JoinColumn(name = "task_id", nullable = false, updatable = true)}, 
      inverseJoinColumns = { 
       @JoinColumn(name = "employee_id", 
         nullable = false, updatable = true)}) 
    private List<Employee> workers; 

TaskOverview.java

@ManagedBean 
@RequestScoped 
public class TaskOverview { 
    private int taskId; 
    private Task task; 

    public void init() { 
     if (taskId > 0) { 
      task = TaskDAO.findById(taskId); 
     } 
    } 

    public Task getTask() { 
     return task; 
    } 
} 

taskView.xhtml

<ui:repeat value="#{taskOverview.task.workers}" var="worker"> 
    <h:outputText value="#{worker.firstName} #{worker.lastName}"/> 
</ui:repeat> 

所以,當我打開網頁taskView.xhtml ?taskId = 3,我應該只在工作列表中看到員工#3。但由於某種原因,他的名字被打印兩次。如果我打開taskId = 2的同一頁面,則這兩名員工將被打印四次。 taskId = 1相同,三名員工打印四次。

我的應用程序中的其他東西(@OneToMany,@ManyToOne和@OneToOne)工作正常。

我感謝所有幫助你們可以提供:)

編輯(和解決方案): 問題肯定是在Hibernate部分(實際上,程序員是問題:))。我試圖從頭開始重寫所有內容,現在它按預期工作。

+0

爲什麼這會成爲JSF問題?你是否暗示它在使用時可以正常工作? 'System.out.println()'顯示列表內容而不是JSF頁面? – BalusC

+0

@BalusC我還沒有嘗試過,但因爲我在這種情況下使用JSF,所以我認爲我也應該放置該標籤。 – vtomic85

+3

爲了增加獲得答案的機會,您應該儘量使問題儘量集中,而不是太寬泛。否則,你的問題更可能被沒有了解JSF的Hibernate用戶忽略。儘可能地隔離你的問題。例如:「我的TaskDAO.findById(taskId)返回一個包含重複工作的任務對象」。在這種情況下,添加僅提供模型的樣板代碼(如JSF)是完全不相關的。你應該採用最簡單的方法:'System.out.println()'。 – BalusC

回答

0

這個問題肯定是在Hibernate部分(實際上,程序員是這個問題:))。我試圖從頭開始重寫所有內容,現在它按預期工作。