1

同样,我们可能有一个非常简单的问题;我们的数据库看起来像:

CREATE TABLE Question (
    idQuestion SERIAL,
    questionContent VARCHAR,

    CONSTRAINT Question_idQuestion_PK PRIMARY KEY (idQuestion),
);

CREATE TABLE Answer (
    idAnswer SERIAL,
    answerContent VARCHAR,
    idQuestion INTEGER,

    CONSTRAINT Answer_idAnswer_PK PRIMARY KEY (idAnswer),
    CONSTRAINT Answer_idQuestion_FK FOREIGN KEY (idQuestion) REFERENCES Question(idQuestion),
);

所以一个问题有很多答案。在 Netbeans 7.1.2 生成的实体中,我们有字段:

@OneToMany(mappedBy = "idquestion", orphanRemoval=true, cascade= CascadeType.ALL, fetch= FetchType.EAGER)
private Collection<Answer> answerCollection;

如您所见,我已经添加了所有可能的孤儿删除和级联指令,用于级联删除集合。它工作正常,但有一刻:

只有在我们应用程序的先前“实例”中创建问题和连接的答案时,您才能删除它们。如果我首先创建一个新问题甚至一个答案,然后直接删除它,我们会收到如下错误:

root cause

Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.postgresql.util.PSQLException: ERROR: update or delete on table "question" violates foreign key constraint "answer_idquestion_fk" on table "answer"
  Detail: Key (idquestion)=(30) is still referenced from table "answer".
Error Code: 0
Call: DELETE FROM question WHERE ((idquestion = ?) AND (version = ?))
    bind => [2 parameters bound]
Query: DeleteObjectQuery(com.accenture.androidwebapp.entities.Question[ idquestion=30 ])
root cause

org.postgresql.util.PSQLException: ERROR: update or delete on table "question" violates foreign key constraint "answer_idquestion_fk" on table "answer"
  Detail: Key (idquestion)=(30) is still referenced from table "answer".

如果我重新启动(重建,重新部署)它正在工作的应用程序..为什么?谢谢!

4

1 回答 1

1

尝试将 EclipseLink@PrivateOwned扩展注释添加到您的集合映射中。

至于在您重新启动应用程序之前无法删除的问题,我想到了两件事:

  • 您可能正在使用非常长的 EntityManager 会话,其中所有内容都连接到 EnitityManager。如果是这种情况,那么重新启动强制更改 EntityManager 会话会有所帮助。完成会话后,请考虑通过调用来使用较短的 EntityManager 会话EntityManager.close()EntityManager.merge()当您想修改它时,使用分离的实体和状态。

  • 二级缓存(如果有)将通过重新部署来清除。尝试禁用二级缓存,看看是否有帮助。

于 2012-08-09T00:34:48.597 回答