关系中实体集合的大小不正确

时间:2013-11-17 18:35:11

标签: jpa

我在编写应用程序时遇到了奇怪的问题。我有两个与双向关系相连的实体。

@Entity
@NamedQueries( value = {
    @NamedQuery( name = "Employee.findAll", query = "SELECT e FROM Employee e")
})
public class Employee extends AbstractModel<Long, Employee>{
    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable( name = "EMP_TASK", joinColumns = {@JoinColumn( name = "EMP_ID", referencedColumnName = "ID")},
            inverseJoinColumns = {@JoinColumn( name = "TASK_ID", referencedColumnName = "ID")})
    private Set<Task> tasks = new HashSet<>();
}

@Entity
public class Task extends AbstractModel<Long, Task>{
    @ManyToMany( mappedBy = "tasks", fetch = FetchType.EAGER)
    private Set<Employee> employees = new HashSet<>();
}

我正在使用NamedQuery Employee.findAll查询员工列表并将其发送到jsp

@Override
protected void processDefaultAction() throws ServletException, IOException {
    List<Employee> employees = employeeService.findAll();
    request.setAttribute("employees", employees);
    forward("employees");
}

当我尝试在jsp中显示包含${fn:length(emp.tasks)}的附加列数的任务时,会出现问题。

对于某些实体,显示的值低于e.q. 2代替3(在数据库3中,给定员工存在关系)。但是当我将servlet代码更改为:

@Override
protected void processDefaultAction() throws ServletException, IOException {
    List<Employee> employees = new LinkedList<>();
    for(Employee emp : employeeService.findAll())
        employees.add(employeeService.find(emp.getId()));
    request.setAttribute("employees", employees);
    forward("employees");
}

一切都正常显示。 看起来好像他们的关系一次性取得所有员工的工作不正常。知道这种行为的原因是什么?

1 个答案:

答案 0 :(得分:0)

确保在添加员工时,将该员工添加到任务的员工集中,反之亦然。

另外不要忘记合并更改。

例如:

public void addEmployee(Task task, EntityManager m) {
  Employee emp = new Employee();
  emp.add(task);
  task.employees.add(emp);

  m.persist(emp);
  m.merge(task);
}

public void addTask(Employee emp, EntityManager m) {
  Task task = new Task();
  task.add(emp);
  emp.tasks.add(task);

  m.persist(task);
  m.merge(emp);
}