如何使用合并

发布于 2024-12-18 07:17:48 字数 1723 浏览 2 评论 0原文

在我的 Web 层中,我显示了一个任务列表,并且对于每个任务,它显示了它有多少个 TaskError。任务以这种方式在控制器类中获取:

public List<Task> getTasks () {
    return taskEJB.findAll();
}

任务具有与 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);
}

Task:deleteTaskErrors(TaskError taskError) 只是从列表中删除任务:

public void deleteTaskError (TaskError p_error) {
    taskErrorCollection.remove(p_error); // gives true
}

这有效。 Web 层显示一个表格,其中包含所有任务及其所具有的任务错误数。删除 TaskError 后该数字会下降 1。

但是... TaskErrorFacade:remove(taskError) 的以下两个实现不起作用:Web 层中的表格不会减去总任务错误计数的 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
}

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

在此处输入图像描述

编辑: 关系的映射也很重要。任务在 TaskError 中的映射方式如下:

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

In my Web tier I show a list of Tasks and for each task it shows how many TaskErrors it has. The tasks are fetched in a controller class this way:

public List<Task> getTasks () {
    return taskEJB.findAll();
}

Task has a @OneToMany mapping with TaskErrors: a task can have multiple task errors.

When I delete a single TaskError, a controller in the Web tier calls TaskErrorFacade:remove(taskError). TaskErrorFacade is a stateless session bean. The code:

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) simply deletes the task from the List:

public void deleteTaskError (TaskError p_error) {
    taskErrorCollection.remove(p_error); // gives true
}

This works. The Web tier shows a tabel with all the task and the number of Task Errors it has. The number drops by 1 after deleting a TaskError.

But... the following two implementations of TaskErrorFacade:remove(taskError) don't work: the tabel in the Web tier doesn't subtract 1 of the total Task Error count (however, they are deleted in the database):

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);

}

And:

public void remove (TaskError taskError) {
    entityManager.remove(entityManager.merge(taskError));

    taskError.getTask().deleteTaskError(taskError); // no merge
}

Why are the two implementations above not working?

enter image description here

Edit: also important are the mappings of the relations. Task is mapped in TaskError this way:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文