2013-11-17 3 views
1

У меня возникла странная проблема при написании приложения. У меня есть два объекта, связанных с двунаправленным отношением.Неверный размер коллекции сущностей из отношения

@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 отношения для данного сотрудника). Однако, когда я меняю код сервлета на:

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

все отображается правильно. Похоже, что сразу все сотрудники сразу же со своими отношениями работали неправильно. Любая идея, что может быть причиной такого поведения?

ответ

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); 
} 
Смежные вопросы