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

Jpa 关系中实体集合的大小不正确,jpa,Jpa,我在写应用程序时遇到了一个奇怪的问题。我有两个以双向关系连接的实体 @Entity @NamedQueries( value = { @NamedQuery( name = "Employee.findAll", query = "SELECT e FROM Employee e") }) public class Employee extends AbstractModel<Long, Employee>{ @ManyToMany(fetch = FetchType

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

@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<>();
}
当我试图在jsp中显示包含
${fn:length(emp.tasks)}
的额外任务列数的员工信息时,就会出现问题

对于某些实体,显示的值低于应显示的值,例如,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");
}
@覆盖
受保护的void processDefaultAction()引发ServletException,IOException{
列出员工=新建LinkedList();
for(员工emp:employeeService.findAll())
add(employeeService.find(emp.getId());
request.setAttribute(“雇员”,雇员);
转发(“员工”);
}
一切都显示得很好。
看起来一次把所有的员工和他们的关系联系起来是不正常的。知道这种行为的原因吗?

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

也不要忘记合并更改

例如:

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);
}
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);
}