我们可能还有一个非常简单的问题; 我们的数据库看起来像:
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".
如果我重新启动(重建、重新部署)应用程序,它仍然可以正常工作……为什么?谢谢!
最佳答案
尝试将 EclipseLink @PrivateOwned
扩展注释添加到您的集合映射中。
至于在您重新启动应用程序之前无法删除的问题,我想到了两件事:
您可能正在使用非常长的 EntityManager session ,其中所有内容都附加到 EnitityManager。如果是这种情况,那么由重新启动强制执行的 EntityManager session 更改会有所帮助。考虑使用较短的 EntityManager session ,方法是在完成 session 后调用
EntityManager.close()
。使用分离的实体并在您想要修改它时返回EntityManager.merge()
状态。二级缓存(如果有)将通过重新部署清除。尝试禁用二级缓存,看看是否有帮助。
关于database - PostgreSQL JPA 级联部分工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11864510/