以正确的方式删除实体和关系(JPA)

时间:2011-11-30 00:53:25

标签: jpa entity dao

我有一个实体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);
}

2 个答案:

答案 0 :(得分:2)

没关系,AFAIK。但是你有一些不正确的假设:

  1. em.remove(p_task)不会抛出ConstraintException。删除将冲洗。如果抛出此异常,则唯一要做的就是回滚事务并关闭实体管理器,因为它会使其处于不一致状态。因此,在将任务从类别中删除之前或之后删除该任务并没有太大区别。
  2. 您删除任务,但不删除该类别。那么为什么这个类别还没有附上呢?

答案 1 :(得分:1)

它是正确的方法。您必须从集中删除任务以确保集功能。

也许在合并之前检查p_task是否真正分离,以及任务c