OpenJPA CascadeType.DELETE导致外键约束违规

时间:2012-05-22 10:48:48

标签: foreign-keys openjpa cascading-deletes

我在WebLogic 10.0.x上使用OpenJPA(JPA 1.0)和Oracle。我已经定义了OneToMany关系,如下所示:

@Entity
public class Compound implements Serializable {
    ...
    @OneToMany(mappedBy="compound", fetch=FetchType.LAZY, cascade=CascadeType.ALL)
    private List<Submission> submissions = new ArrayList<Submission>();
    ...
}

@Entity
public class Submission implements Serializable {
    ...
    @ManyToOne(fetch=FetchType.LAZY, cascade=CascadeType.REFRESH)
    @JoinColumn(name="compoundId")
    private Compound compound;
    ...
}

当我删除复合实体时,也应删除所有子提交实体。这是一般规则,除了我在这些表上设置了外键约束:

ALTER TABLE SUBMISSION
ADD CONSTRAINT FK_SUBMISSION_COMPOUND
    FOREIGN KEY (COMPOUNDID)
    REFERENCES COMPOUND(COMPOUNDID);

现在当我尝试删除Compound实体时遇到以下异常:

ORA-02292: integrity constraint (HELC.FK_SUBMISSION_COMPOUND) violated - child record found {prepstmnt 3740 DELETE FROM Compound WHERE compoundId = ? [params=(long) 10384]} [code=2292, state=23000]"

上述异常意味着Open JPA在将删除级联到子实体之前尝试删除父级。我已经阅读了几篇关于这个例外的文章,可以追溯到2006年。但是,最新的文章表明这​​个bug已经修复了?

http://mail-archives.apache.org/mod_mbox/openjpa-dev/200609.mbox/%3C14156901.1158019042738.JavaMail.jira@brutus%3E

https://issues.apache.org/jira/browse/OPENJPA-235

任何人都可以建议为什么这不起作用,我可以做些什么呢?我不愿意手动删除子实体,特别是因为这是我的模式中不那么复杂的关系之一,无论我使用什么解决方案,我都需要在其他地方应用。

由于 杰

1 个答案:

答案 0 :(得分:1)

  

当我删除复合实体时,所有子提交实体都应该   也被删除。这是一般规则,除了我有一个   这些表上的外键约束设置:

如果您可以更改外键约束,那么就数据库而言应该解决问题。我不确定OpenJPA将如何表现。

ALTER TABLE SUBMISSION
ADD CONSTRAINT FK_SUBMISSION_COMPOUND
    FOREIGN KEY (COMPOUNDID)
    REFERENCES COMPOUND(COMPOUNDID)
    ON DELETE CASCADE;
  

有一件事 - 如上所述,这是Weblogic 10.0.x.我怀疑我们   正在使用捆绑的OpenJPA / Kodo版本   很老......

我自己的感觉是你提到的错误应该已经被这个版本修复了,但它也a)足够接近它可能没有被修复,并且b)可能是一个足够大的问题,我认为你应花一些时间来验证版本并修复。 (实际上,我刚注意到OpenJPA 1.0 was released on Aug 2007。这比我想象的要早得多,这使得你更有可能没有修复错误。)

如果您无法修改数据库(因为它是一个显然不打算让客户依赖级联删除的遗留系统),并且如果您的版本中没有修复该错误,则必须进行管理自己的SQL语句的顺序。

手动管理SQL语句的负担 - 这是OpenJPA应该为你做的事情之一 - 可能足以让管理层升级OpenJPA或更新外部数据库中的关键约束。

我真的希望你得到一个比这个更好的答案。

相关问题