На своем веб-уровне я показываю список задач и для каждой задачи показывает, сколько у него есть TaskErrors. Задачи выбираются в классе контроллера следующим образом:
public List<Task> getTasks () {
return taskEJB.findAll();
}
Задача имеет отображение @OneToMany с TaskErrors: у задачи может быть несколько ошибок задачи.
Когда я удаляю одно TaskError, контроллер на веб-уровне вызывает TaskErrorFacade: remove (taskError). TaskErrorFacade - это сессионный компонент без сохранения состояния. Код:
public void remove (TaskError taskError) {
entityManager.remove(entityManager.merge(taskError));
Task task = taskError.getTask();
task.deleteTaskError(taskError);
task = entityManager.merge(task);
}
Task: deleteTaskErrors (TaskError taskError) просто удаляет задачу из списка:
public void deleteTaskError (TaskError p_error) {
taskErrorCollection.remove(p_error); // gives true
}
Это работает. На веб-уровне отображается таблица со всей задачей и количеством ошибок в ней. Число уменьшается на 1 после удаления ошибки TaskEr.
Но ... следующие две реализации TaskErrorFacade: remove (taskError) не работают: табель на веб-уровне не вычитает 1 из общего количества ошибок Task (однако они удаляются в базе данных) :
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
}
Почему две реализации выше не работают?
Редактировать: также важны сопоставления отношений. Задача отображается в TaskError следующим образом:
@JoinColumn(name = "task_id", referencedColumnName = "id")
@ManyToOne(optional = false)
private Task task;