我在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已经修复了?
https://issues.apache.org/jira/browse/OPENJPA-235
任何人都可以建议为什么这不起作用,我可以做些什么呢?我不愿意手动删除子实体,特别是因为这是我的模式中不那么复杂的关系之一,无论我使用什么解决方案,我都需要在其他地方应用。
由于 杰
答案 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或更新外部数据库中的关键约束。
我真的希望你得到一个比这个更好的答案。