我们可能还有一个非常简单的问题; 我们的数据库看起来像:
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".
如果我重新启动(重建,重新部署)它正在运行的应用程序..为什么?谢谢!
答案 0 :(得分:1)
尝试将EclipseLink @PrivateOwned
扩展注释添加到集合映射中。
至于在重新启动应用程序之前删除无效的问题,我会想到两件事:
您可能正在使用非常长的EntityManager会话,其中所有内容都保持附加到EnitityManager。如果是这种情况,那就是重启所强制的EntityManager会话的变化有所帮助。完成会话后,可以通过调用EntityManager.close()
来考虑使用较短的EntityManager会话。处理分离的实体,EntityManager.merge()
在您想要修改它时重新输入。
第二级缓存(如果有)将由重新部署清除。尝试禁用二级缓存,看看是否有帮助。