database - PostgreSQL JPA 级联部分工作

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

如果我重新启动(重建、重新部署)应用程序,它仍然可以正常工作……为什么?谢谢!

最佳答案

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

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

  • 您可能正在使用非常长的 EntityManager session ,其中所有内容都附加到 EnitityManager。如果是这种情况,那么由重新启动强制执行的 EntityManager session 更改会有所帮助。考虑使用较短的 EntityManager session ,方法是在完成 session 后调用 EntityManager.close()。使用分离的实体并在您想要修改它时返回 EntityManager.merge() 状态。

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

关于database - PostgreSQL JPA 级联部分工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11864510/

相关文章:

mysql - IN 和 NOT IN 子句不适用

mysql - 重构基于用户的模块化网站

mysql - 如何正确使用MySQL的COUNT()?

java - hibernate 选择导致更新

java - Hibernate ManyToOne n+1 使用 id 选择

sql - 有没有更好的方法来提取一天中的时间?

sql-server - 从数据库中选择现有数据创建测试数据

java - getCurrentSession() 与 openSession()

sql - 相同的 SELECT 与 DELETE 查询创建不同的查询计划,执行时间差异很大

postgresql - Postgres Cast 复合类型