JPA CascadeType.ALL无法通过查询工作?

时间:2012-12-03 10:43:07

标签: java jpa

我有OneToMany个双向关系实体类(WorkOrderTask)。 WorkOrder有一个或多个Task。 当我通过查询删除WorkOrder enity时,我得到外键约束异常。 EntityManager无法自动删除相关的Task

我的问题:CascadeType.REMOVE方法是否使用了em.removed(..)?它是否被query使用?(删除查询)。

WorkOrder.java

.....
public class WorkOrder {
    ....
    @Temporal(TemporalType.TIMESTAMP)
    private Date expiryDate;

    @OneToMany(cascade=CascadeType.ALL, mappedBy="workOrder", orphanRemoval=true)
    private List<Task> taskList;
    ......
}

Task.java

......
public class Task {
    .....
    @ManyToOne
    @JoinColumn(name = "WORK_ORDER_ID", referencedColumnName = "ID")
    private WorkOrder workOrder;
    .....
}

我需要根据到期日期删除WorkOrder。我需要首先删除相关的Task,之后我必须删除WorkOrder。这是对的吗? 我认为CascadeType可以使用Query更好。

1 个答案:

答案 0 :(得分:8)

根据规范,DELETE by query(查询开始“DELETE FROM ...”)不会触发此类回调(因为它是一种快速从数据存储中删除数据的方式);回调仅由正常的持久性操作(持久化,合并,刷新,删除)使用,因此如果您希望遵循其行为,则使用 remove()