2012-05-22 92 views
1

我在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

任何人都可以说明为什么这不是工作,我能做些什么呢?我不喜欢手动删除子实体,特别是因为这是我架构中较不复杂的关系之一,无论我使用什么解决方案,我都需要在其他地方应用。

感谢 周杰伦

+0

你在OpenJPA有多少经验?提交中的CascadeType有可能是错误的吗? –

+0

OpenJPA?不多。我不知道在提交类中是否需要级联定义?这是一个独立的实体,所以如果父(复合)实体被删除,它应该被删除,但删除提交不应该删除父。就我所知,我的代码是正确的。 –

+0

有一件事 - 如上所述,这是Weblogic 10.0.x.我怀疑我们使用的OpenJPA/Kodo的捆绑版本,这可能是相当老... –

回答

1

当我删除复合实体的所有孩子提交实体应 也被删除。这个工程作为一般规则,但我对这些表一 外键约束设置:

如果你可以改变外键约束,应该尽可能的数据库而言解决问题。我不确定OpenJPA在这里的表现如何。

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

一两件事 - 高于此所讨论的是Weblogic的10.0.x.我怀疑我们 正在使用的OpenJPA /科多兽,这可能是 很老的捆绑版本...

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

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

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

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

+0

嗨Catcall。我已经尝试过了。它似乎最初工作,但后来我开始从JPA得到的错误消息说,子实体已被修改在事务上下文之外(我错过了确切的错误信息)。此外,我有点不情愿在数据库中添加删除级联。 –

+0

是否由OpenJPA生成约束? –

+0

不,这是一个遗留数据库,我正在为它创建一个前端。这也是为什么我不愿意添加删除级联条款除非绝对必要的原因之一。 –