2012-04-03 81 views
5

甲骨文使用的EclipseLink:的EclipseLink:與級聯刪除的問題做更新,而不是

我有一個到父(工作流程)之間的兒童(階段)一對多的關係。在數據庫中,我有一個刪除約束,以便刪除工作流刪除階段。這從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.REQUIRED)方法和內部然後em.remove(工作流),該對象,

我得到例外,如

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,而不是僅僅刪除階段行本身的階段表?

我該如何解決?

回答

0

您刪除的工作流程中,註釋屬性的mappedBy意味着階段擁有自己的工作流程,因此實現JPA更新階段,使它們符合你映射theese實體的方式。

我你想要做什麼的猜測是,以消除工作流程中的mappedBy。

更改階段 這樣的映射:

class Stage { 
    @Override 
    @ManyToOne(mappedBy="stages") // supposed to be the name (in Workflow) of the persisted property here, I'm not used to annotate on the getter 
    // no JoinColumn - WorkFlow has already defined the relationship 
    public Workflow getWorkflow() { 
     return m_workflow; 
    } 
} 

在舊階段(除了事實上它沒有工作),你要刪除一個工作流程,從而刪除所有其他階段的工作流,如果你刪除了單個階段。 不要以爲這是真正的意圖。

+0

@ManyToOne沒有屬性的mappedBy – MeBigFatGuy 2012-04-03 15:29:35

1

你不應該有JoinColumn上的工作流爲您正在使用的mappedBy,最有可能的原因。 JoinColumn通常不應用於OneToMany(僅在JPA 2.0中允許),它僅適用於單向OneToManys。

否則包含事務的完整類和SQL跟蹤。它看起來像遇到了雙向約束,並試圖通過淺層刪除來解決它。你們之間有其他關係嗎?

如果您使用刪除數據庫中的級聯可以標記與@CascadeOnDelete的一對多關係,避免delete語句。

見, http://wiki.eclipse.org/EclipseLink/Examples/JPA/DeleteCascade