2012-04-03 14 views
5

Oracle mit Eclipse tun:Eclipselink: Probleme mit Kaskade löschen Update statt

ich eine Eins-zu-Beziehung zwischen einem Elternteil (Workflow) haben und Kinder (Bühne). In der Datenbank habe ich eine Löschbedingung, die in der Workflow-Löschstufe gelöscht wird. Dies funktioniert gut von 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; 
    } 
} 

wenn i laden den Arbeitsablauf von Namen innerhalb einer @Transactional (Propagation = Propagation.REQUIRED) -Methode und dann em.remove (Workflow), dass das Objekt,

I Ausnahmen erhalten, wie

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 

weil ich die stages.workflow_id -Spalte definiert habe, um nicht nullbar zu sein.

Warum versucht Eclipselink, die Stages-Tabelle mit Null-Workflow-IDs zu aktualisieren, anstatt nur die Stage-Zeile selbst zu löschen?

Wie behebe ich das?

Antwort

0

Sie entfernen den Workflow, die Annotationseigenschaft mappedBy bedeutet, dass Etappen ihren Workflow besitzen, sodass die JPA-Implementierung die Phasen aktualisiert, damit sie der Art und Weise entsprechen, wie Sie diese Entitäten gemappt haben.

Meine Vermutung, was Sie tun möchten, ist das MappingBy auf Workflow zu entfernen.

die Zuordnungen in Stufen ändern wie folgt aus:

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; 
    } 
} 

Mit den alten Stufen (neben der Tatsache, es hat nicht funktioniert) würden Sie eine Workflow-löschen und damit alle anderen Stufen in diesem Workflow löschen, wenn Sie eine einzelne Stufen gelöscht. Denke nicht, dass das die eigentliche Absicht war.

+0

@ManyToOne keinen mappedBy Attribut – MeBigFatGuy

1

Sie sollten die JoinColumn nicht auf dem WorkFlow haben, da Sie ein mappedBy verwenden, was wahrscheinlich die Ursache ist. Eine JoinColumn sollte normalerweise nicht für OneToMany verwendet werden (war nur in JPA 2.0 erlaubt), nur für unidirektionale OneToManys.

Andernfalls die vollständigen Klassen und SQL-Trace der Transaktion enthalten. Es sieht so aus, als ob es auf eine bidirektionale Einschränkung stößt und versucht, es durch ein seichtes Löschen aufzulösen. Hast du andere Beziehungen zwischen den beiden?

Wenn Sie die Löschkaskadierung in der Datenbank verwenden, können Sie die OneToMany-Beziehung mit @CascadeOnDelete markieren, um die Löschanweisung zu vermeiden.

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

Verwandte Themen