2016-09-30 2 views
0

私はHibernateの初心者です。JSF2 + Hibernate 4.3を使用して私の最初のプロジェクトに取り組んでいます。 @ManyToManyの関係に問題があると思います。Hibernateと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、私はワーカーリストにEmployee#3しか表示されません。しかし何らかの理由で、彼の名前は2度印刷されます。 taskId = 2の同じページを開くと、2人の従業員が4回印刷されます。 taskId = 1と同じ3人の従業員が4回印刷されます。

私のアプリケーション(@OneToMany、@ManyToOne、@OneToOne)の他のものは正常に動作します。

私はあなたたちが提供できるすべてのヘルプ:)

編集(およびソリューションを)認める: は問題はHibernateの一部に間違いだった(実際には、プログラマは:)問題でした)。私は最初からすべてを書き直そうとしましたが、今は意図どおりに動作します。

+0

なぜこれがJSFの問題ですか?あなたは、それがうまく動作することを暗示していますか? 'System.out.println()'はJSFページの代わりにリストの内容を表示しますか? – BalusC

+0

@BalusC私はそれを試していませんでしたが、この場合JSFを使用していたので、私はそのタグも置くべきだと思いました。 – vtomic85

+3

答えを得る機会を増やすには、広すぎるのではなく、できるだけ集中して質問をするようにしてください。さもなければ、あなたの質問は、JSFについて何か知っていることがないHibernateユーザによって無視される可能性が高くなります。できるだけ問題を分離してください。たとえば、 "My TaskDAO.findById(taskId)は、重複するワーカーを含むタスクオブジェクトを返します"。そのような場合、JSFなどのモデルを提示するだけの定型コードを追加することは完全に無関係です。あなたは最も簡単な方法、 'System.out.println()'に行くべきです。ありがとうございます。 – BalusC

答えて

0

問題は明らかにHibernateの部分でした(実際は、プログラマが問題でした:))。私は最初からすべてを書き直そうとしましたが、今は意図どおりに動作します。