我在WebLogic 10.0.x上使用OpenJPA(JPA 1.0)和Oracle。我已经定义了OneToMany关系如下:OpenJPA CascadeType.DELETE导致外键违规
@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);
现在,当我试图删除我遇到以下异常复合实体:
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/%[email protected]%3E
https://issues.apache.org/jira/browse/OPENJPA-235
任何人都可以说明为什么这不是工作,我能做些什么呢?我不喜欢手动删除子实体,特别是因为这是我架构中较不复杂的关系之一,无论我使用什么解决方案,我都需要在其他地方应用。
感谢 周杰伦
你在OpenJPA有多少经验?提交中的CascadeType有可能是错误的吗? –
OpenJPA?不多。我不知道在提交类中是否需要级联定义?这是一个独立的实体,所以如果父(复合)实体被删除,它应该被删除,但删除提交不应该删除父。就我所知,我的代码是正确的。 –
有一件事 - 如上所述,这是Weblogic 10.0.x.我怀疑我们使用的OpenJPA/Kodo的捆绑版本,这可能是相当老... –