我在编写应用程序时遇到了奇怪的问题。我有两个与双向关系相连的实体。
@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");
}
一切都正常显示。 看起来好像他们的关系一次性取得所有员工的工作不正常。知道这种行为的原因是什么?
答案 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);
}