在我的Web层中,我显示了一个任务列表,并为每个任务显示了它有多少个TaskErrors。这些任务以这种方式在控制器类中获取:
public List<Task> getTasks () {
return taskEJB.findAll();
}
Task与TaskErrors有一个@OneToMany映射:任务可能有多个任务错误。
当我删除单个TaskError时,Web层中的控制器调用TaskErrorFacade:remove(taskError)。 TaskErrorFacade是一个无状态会话bean。代码:
public void remove (TaskError taskError) {
entityManager.remove(entityManager.merge(taskError));
Task task = taskError.getTask();
task.deleteTaskError(taskError);
task = entityManager.merge(task);
}
任务:deleteTaskErrors(TaskError taskError)只是从List中删除任务:
public void deleteTaskError (TaskError p_error) {
taskErrorCollection.remove(p_error); // gives true
}
这很有效。 Web层显示一个包含所有任务和它具有的任务错误数的表。删除TaskError后,该数字将减1。
但是......以下两个TaskErrorFacade实现:remove(taskError)不起作用:Web层中的tabel不会减去总任务错误计数中的1个(但是,它们会在数据库中删除) :
public void remove (TaskError taskError) {
entityManager.remove(entityManager.merge(taskError));
Task task = taskError.getTask();
task = entityManager.merge(task); // the merge is done before the deletion
task.deleteTaskError(taskError);
}
和
public void remove (TaskError taskError) {
entityManager.remove(entityManager.merge(taskError));
taskError.getTask().deleteTaskError(taskError); // no merge
}
为什么上面的两个实现不起作用?
编辑:也很重要的是关系的映射。 Task以这种方式映射到TaskError中:
@JoinColumn(name = "task_id", referencedColumnName = "id")
@ManyToOne(optional = false)
private Task task;