2

我在 Task 和 TaskError 之间有一个简单的 OneToMany 关系。

任务映射 TaskErrors:

@OneToMany(cascade = CascadeType.ALL, mappedBy = "task", orphanRemoval = true)
private List<TaskError> taskErrorCollection;

TaskErrors 应该在任务被删除时被删除,因此 orphanRemoval。

TaskError 连接到一个任务:

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

当我使用以下代码添加 TaskError 时,Task 中的 TaskErrors 列表未更新:

TaskError taskError;
// set all taskErrors vars
taskErrorDAO.create(taskError);

因此,数据库包含 TaskError 的一行,而 Task 中的 TaskErrors 列表未填充。显然,当我删除任务时,它给出了一个错误: MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row

我个人是否需要在 Task 中填充 TaskError 列表?有没有办法让这个列表自动填充?taskErrorDAO.create(taskError) 之后的 em.flush 没有帮助。

关系

4

1 回答 1

4

开发人员负责实体关系的内存表示。所以 - 是的,您需要在的列表中填充TaskError实例。Task TaskError

您可以尝试清理PersistenceContext缓存Task并直接从数据库中重新获取它,例如:

em.refresh(task);

或者

em.clear();
task = em.find(Task.class, yourTaskId);

无论哪种方式,您的 JPA 提供程序都应该清除您的实体的内存表示,点击数据库(正如您所说,它已正确插入行)以获取它并正确加载列表。但是,从长远的角度来看,我不会这样做,而只是相应地更新我的对象引用。
如果您拒绝更新实体的内存中关系,则不能使用PersistenceContext. 为了获得正确的数据,您每次需要在分配Task任何新实体后使用/获取您的实体时都需要访问数据库。TaskError

还有一件事-为什么你Cascade.ALLTaskError?如果已删除,您要删除Task实例TaskError吗?

您还可以查看此资源以获取更多信息。

于 2011-11-23T09:11:54.353 回答