我在带有 Oracle 的 WebLogic 10.0.x 上使用 OpenJPA (JPA 1.0)。我已经定义了一个 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
谁能建议为什么这不起作用以及我能做些什么?我不愿意手动删除子实体,特别是因为这是我的架构中不太复杂的关系之一,我为此使用的任何解决方案都需要在其他地方应用。
谢谢杰