1

ここでも、非常に単純な問題が発生する可能性があります。データベースは次のようになります。

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;

ご覧のとおり、コレクションのカスケード削除について、可能なすべての孤立した削除とカスケード手順を既に追加しました。そして、それはうまく機能していますが、しばらくの間:

アプリケーションの以前の「インスタンス」で作成された場合にのみ、質問と接続された回答を削除できます。最初に新しい質問と 1 つの回答を作成してから、そのまま削除すると、次のようなエラーが発生します。

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

アプリケーションを再起動 (再構築、再デプロイ) すると、動作しますが..なぜですか? ありがとう!

4

1 に答える 1

1

EclipseLink@PrivateOwned拡張アノテーションをコレクション マッピングに追加してみてください。

アプリを再起動するまで削除が機能しない問題については、次の 2 つのことが考えられます。

  • すべてが EnitityManager にアタッチされたままの非常に長い EntityManager セッションを使用している可能性があります。その場合、再起動によって強制された EntityManager セッションの変更が役に立ちます。セッションの終了時に呼び出して、より短い EntityManager セッションを使用することを検討してくださいEntityManager.close()。切り離されたエンティティを操作EntityManager.merge()し、変更する必要がある場合はステートを元に戻します。

  • 第 2 レベルのキャッシュがある場合は、再デプロイによってクリアされます。二次キャッシュを無効にしてみて、それが役立つかどうかを確認してください。

于 2012-08-09T00:34:48.597 に答える