2016-09-30 38 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部分(实际上,程序员是这个问题:))。我试图从头开始重写所有内容,现在它按预期工作。