PostgreSQL JPA级联部分工作

时间:2012-08-08 12:26:33

标签: database hibernate postgresql jpa entity

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

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".

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

1 个答案:

答案 0 :(得分:1)

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

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

  • 您可能正在使用非常长的EntityManager会话,其中所有内容都保持附加到EnitityManager。如果是这种情况,那就是重启所强制的EntityManager会话的变化有所帮助。完成会话后,可以通过调用EntityManager.close()来考虑使用较短的EntityManager会话。处理分离的实体,EntityManager.merge()在您想要修改它时重新输入。

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