Database PostgreSQL JPA级联部分工作

Database PostgreSQL JPA级联部分工作,database,hibernate,postgresql,jpa,entity,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,

同样,我们可能有一个非常简单的问题; 我们的数据库如下所示:

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;

如果我重新启动(重建、重新部署)应用程序,它仍在工作。。为什么?谢谢

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

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

  • 您可能正在使用很长的EntityManager会话,其中所有内容都与EntityManager保持连接。如果是这样的话,则是重启强制更改EntityManager会话才有帮助。当您完成会话时,请考虑调用短的EntyMealMeCube会话,调用<代码> EntyMealth.Cutele](< /代码>)。使用分离的实体,并在需要修改时将其返回到
    EntityManager.merge()
    状态

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


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

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

  • 您可能正在使用很长的EntityManager会话,其中所有内容都与EntityManager保持连接。如果是这样的话,则是重启强制更改EntityManager会话才有帮助。当您完成会话时,请考虑调用短的EntyMealMeCube会话,调用<代码> EntyMealth.Cutele](< /代码>)。使用分离的实体,并在需要修改时将其返回到
    EntityManager.merge()
    状态

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


如果刷新()实体管理器,然后删除,是否成功?没有帮助。我猜这是因为收藏没有被重新加载或其他原因。我仍然在自己寻找:)无论我做什么都没有帮助。。。而问题只发生在同一次“运行”中。我可以从应用程序中注销,关闭浏览器,添加更多问题,不管是什么-删除运行中创建的任何问题,导致错误:/Redeploy及其工作…您是使用扩展持久性上下文,还是长时间打开EntityTransaction?我想知道您的应用程序的“运行”是否使用单个巨型事务并将所有内容都连接到EntityManager,而不是使用短控制事务。不管它是同一个应用程序实例中的新EntityManager还是新的应用程序实例。Long
EntityTransaction
s不会立即导致您的问题,但会导致性能问题,并有丢失未提交数据的风险,并且可能会解释重新启动后的差异。此外,请显示
Answer
的映射。如果刷新()实体管理器,然后删除,是否成功?没有帮助。我猜这是因为收藏没有被重新加载或其他原因。我仍然在自己寻找:)无论我做什么都没有帮助。。。而问题只发生在同一次“运行”中。我可以从应用程序中注销,关闭浏览器,添加更多问题,不管是什么-删除运行中创建的任何问题,导致错误:/Redeploy及其工作…您是使用扩展持久性上下文,还是长时间打开EntityTransaction?我想知道您的应用程序的“运行”是否使用单个巨型事务并将所有内容都连接到EntityManager,而不是使用短控制事务。不管它是同一个应用程序实例中的新EntityManager还是新的应用程序实例。Long
EntityTransaction
s不会立即导致您的问题,但会导致性能问题,并有丢失未提交数据的风险,可能会解释重新启动后的差异。此外,请显示您的
答案映射
。真正有帮助的是
@覆盖
删除
方法如下:
@覆盖公共无效删除(问题实体){em.refresh(实体);super.remove(实体);}
所以我猜这是em会话的问题。我们如何解决这个问题?有什么我们应该调查的吗?@Atais正在重写什么remove方法?是刀还是门面?它通常做什么?至于会议:由于提供了大量的信息,几乎不可能说。你没有提到你的应用程序的配置或操作,会话是如何管理的,等等。好的,有太多的解释,但我们之前已经在这里对我们的应用程序做了一个原则:有问题的是有一个图表。@Atais OK,您正在为您的外观使用无状态会话bean(EJB3.1?)。您是否正在使用JTA数据源,以便容器为您进行事务处理管理?或者,您是否将jdbc数据源与JPA管理的事务一起使用?我打赌是后者,而且你无意中得到了很长的疗程。考虑JTA和容器管理的TX,它在使用无状态EJB时工作良好。我们可以对应用程序做一些危害较小的更改吗?我们真的不想改变整个数据库连接,实际帮助的是
@覆盖
删除
方法如下:
@Override public void remove(Question entity){em.refresh(entity);super.remove(entity);}
,所以我想这是em会话的问题。我们如何解决这个问题?有什么我们应该调查的吗?@Atais正在重写什么remove方法?是刀还是门面?它通常做什么?至于会议:由于提供了大量的信息,几乎不可能说。你没有提到你的应用程序的配置或操作,会话是如何管理的,等等
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".