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

Zaw*_* oo 1 java jpa

我有OneToMany双向关系enity类(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;
    ......
}
Run Code Online (Sandbox Code Playgroud)

Task.java

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

我需要WorkOrder根据到期日删除.我需要先删除相关内容Task,之后我必须删除WorkOrder.这是对的吗?我认为,它会更好CascadeTypeQuery.

Dat*_*eus 8

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

  • 正如DataNucleus所说 - em.remove( - )是一个删除JPA操作,它遵循级联行为.以DELETE开头的JPQL查询(它实际上命名为"批量删除"或本机DELETE SQL查询都省略了级联行为.它是JPA 2.0规范的一部分. (2认同)