如何使用合并

时间:2011-11-25 14:56:06

标签: jpa merge ejb managed

在我的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
}

为什么上面的两个实现不起作用?

enter image description here

编辑:也很重要的是关系的映射。 Task以这种方式映射到TaskError中:

@JoinColumn(name = "task_id", referencedColumnName = "id")
@ManyToOne(optional = false)
private Task task;

0 个答案:

没有答案