【发布时间】:2012-05-28 20:30:34
【问题描述】:
我在带有 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 在将删除级联到子实体之前尝试删除父级。我通过 Google 阅读了几篇关于此异常的文章,可追溯到 2006 年。但是,最近的文章表明此错误已得到修复?
https://issues.apache.org/jira/browse/OPENJPA-235
谁能建议为什么这不起作用以及我能做些什么?我不愿意手动删除子实体,尤其是因为这是我的架构中不太复杂的关系之一,我为此使用的任何解决方案都需要在其他地方应用。
谢谢 周杰伦
【问题讨论】:
-
您在 OpenJPA 方面有多少经验?是不是你 Submission 中的 CascadeType 有误?
-
OpenJPA?不多。我不知道 Submission 类中是否需要级联定义?这是一个依赖实体,因此如果父(复合)实体被删除,则应将其删除,但删除提交不应删除父实体。据我所知,我的代码是正确的。
-
一件事 - 如上所述,这是 Weblogic 10.0.x。我怀疑我们使用的是捆绑版本的 OpenJPA / Kodo,它可能已经很老了......
-
我认为这已经足够老了,您可能没有修复该错误。更新了我的答案。
标签: foreign-keys openjpa cascading-deletes