【发布时间】:2012-04-03 02:57:03
【问题描述】:
使用 EclipseLink 的 Oracle:
我在父级(工作流程)和子级(阶段)之间存在一对多的关系。在数据库中,我有一个删除约束,以便在工作流删除阶段删除。这在 sqlplus 中运行良好。
class Workflow {
@Override
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "workflow", targetEntity = Stage.class)
@JoinColumn(name = "WORKFLOW_ID")
public Set<Stage> getStages() {
return m_stages;
}
}
class Stage {
@Override
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, optional = false, targetEntity = Workflow.class)
@JoinColumn(name = "WORKFLOW_ID", nullable = false)
public Workflow getWorkflow() {
return m_workflow;
}
}
当我在 @Transactional(propagation = Propagation.REQUIRED) 方法中按名称加载工作流,然后 em.remove(workflow) 该对象时,
我得到异常,例如
Error Code: 1407
Call: UPDATE STAGES SET WORKFLOW_ID = ?, FAILURE_STAGE_ID = ?, SUCCESS_STAGE_ID = ? WHERE (STAGE_ID = ?)
bind => [4 parameters bound]
Caused by: java.sql.SQLException: ORA-01407: cannot update ("DB"."STAGES"."WORKFLOW_ID") to NULL
因为我已将stages.workflow_id 列定义为不可为空。
为什么 eclipselink 尝试使用空工作流 ID 更新阶段表,而不是仅仅删除阶段行本身?
我该如何解决?
【问题讨论】:
标签: java jpa eclipselink cascade