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部分(实际上,程序员是问题:))。我试图从头开始重写所有内容,现在它按预期工作。
为什么这会成为JSF问题?你是否暗示它在使用时可以正常工作? 'System.out.println()'显示列表内容而不是JSF页面? – BalusC
@BalusC我还没有尝试过,但因为我在这种情况下使用JSF,所以我认为我也应该放置该标签。 – vtomic85
为了增加获得答案的机会,您应该尽量使问题尽量集中,而不是太宽泛。否则,你的问题更可能被没有了解JSF的Hibernate用户忽略。尽可能地隔离你的问题。例如:“我的TaskDAO.findById(taskId)返回一个包含重复工作的任务对象”。在这种情况下,添加仅提供模型的样板代码(如JSF)是完全不相关的。你应该采用最简单的方法:'System.out.println()'。 – BalusC