我有一个实体Task和一个dao:TaskDao。 Task实体具有到Category的ManyToOne映射。当我删除任务时,我还需要从类别中的集合中删除任务:
// remove() method in TaskDao
public void remove (Task p_task) {
// p_task is Detached, p_task.getCategory() is Detached
p_task = em.merge(p_task);
// p_task is Attached, p_task.getCategory() is Attached
em.remove(p_task);
// p_task is Detached, p_task.getCategory() is Attached
p_task.getCategory().removeTask(p_task);
}
注释表明(此时)p_task和/或p_task.category是否为Attached / Detached。首先让我解释为什么我选择这种陈述顺序。首先,我需要合并p_task,以便附加p_task.category,并且为了删除p_task,它需要合并。 p_task最后会从类别集合中删除,因为em.remove(p_task)可以抛出ConstraintException,在这种情况下,不应该从类别集合中删除任务。
这是正确的认可吗?另外,我很惊讶在em.remove(p_task)之后,仍然附加了p_task.category。
编辑:我应该从实体类中提供一些代码。
public class Task implements Serializable {
@JoinColumn(name = "category_id", referencedColumnName = "id")
@ManyToOne(cascade = CascadeType.MERGE, optional = false)
private Category category;
}
public class Category implements Serializable {
@OneToMany(cascade = CascadeType.MERGE, mappedBy = "category")
private List<Task> taskCollection;
public void addTask (Task p_task) {
if (taskCollection == null) {
taskCollection = new ArrayList<>();
}
if (!taskCollection.contains(p_task)) {
taskCollection.add(p_task);
}
}
public void removeTask (Task p_task) {
taskCollection.remove(p_task);
}
}
在以下代码中,p_task从category.taskCollection中删除,同时回滚事务:
// remove() method in TaskDao
public void remove (Task p_task) {
p_task = em.merge(p_task);
p_task.getCategory().removeTask(p_task); // will not be rolled back if em.remove(p_task) throws an exception
em.remove(p_task);
}
答案 0 :(得分:2)
没关系,AFAIK。但是你有一些不正确的假设:
答案 1 :(得分:1)
它是正确的方法。您必须从集中删除任务以确保集功能。
也许在合并之前检查p_task是否真正分离,以及任务c