1

Oracle を使用する WebLogic 10.0.x で OpenJPA (JPA 1.0) を使用しています。OneToMany 関係を以下のように定義しました。

@Entity
public class Compound implements Serializable {
    ...
    @OneToMany(mappedBy="compound", fetch=FetchType.LAZY, cascade=CascadeType.ALL)
    private List<Submission> submissions = new ArrayList<Submission>();
    ...
}

@Entity
public class Submission implements Serializable {
    ...
    @ManyToOne(fetch=FetchType.LAZY, cascade=CascadeType.REFRESH)
    @JoinColumn(name="compoundId")
    private Compound compound;
    ...
}

複合エンティティを削除すると、すべての子提出エンティティも削除する必要があります。これらのテーブルに外部キー制約を設定していることを除いて、これは一般的なルールとして機能します。

ALTER TABLE SUBMISSION
ADD CONSTRAINT FK_SUBMISSION_COMPOUND
    FOREIGN KEY (COMPOUNDID)
    REFERENCES COMPOUND(COMPOUNDID);

複合エンティティを削除しようとすると、次の例外が発生します。

ORA-02292: integrity constraint (HELC.FK_SUBMISSION_COMPOUND) violated - child record found {prepstmnt 3740 DELETE FROM Compound WHERE compoundId = ? [params=(long) 10384]} [code=2292, state=23000]"

上記の例外は、子エンティティに削除をカスケードする前に、Open JPA が親を削除しようとしていることを意味します。2006 年にさかのぼる、この例外に関する Google の記事をいくつか読みました。

http://mail-archives.apache.org/mod_mbox/openjpa-dev/200609.mbox/%3C14156901.1158019042738.JavaMail.jira@brutus%3E

https://issues.apache.org/jira/browse/OPENJPA-235

これが機能しない理由と、それに対して何ができるかを誰かが提案できますか? 子エンティティを手動で削除するのは嫌いです。特に、これは私のスキーマでそれほど複雑ではない関係の 1 つであり、これに使用するソリューションは別の場所に適用する必要があるためです。

ありがとうジェイ

4

1 に答える 1

1

複合エンティティを削除すると、すべての子提出エンティティも削除する必要があります。これらのテーブルに外部キー制約を設定していることを除いて、これは一般的なルールとして機能します。

外部キー制約を変更できる場合、データベースに関する限り、問題は解決するはずです。ここで OpenJPA がどのように動作するかはわかりません。

ALTER TABLE SUBMISSION
ADD CONSTRAINT FK_SUBMISSION_COMPOUND
    FOREIGN KEY (COMPOUNDID)
    REFERENCES COMPOUND(COMPOUNDID)
    ON DELETE CASCADE;

1 つ - 上記で説明したように、これは Weblogic 10.0.x です。おそらくかなり古い OpenJPA / Kodo のバンドル バージョンを使用していると思われます...

あなたが言及したバグはこのバージョンで修正されるべきだったと私は感じています。バージョンと修正を確認する時間。(実際、 OpenJPA 1.0 が 2007 年 8 月にリリースされたことに気付きました。これは私が思っていたよりもずっと早いので、バグ修正が適用されていない可能性が高いです。)

データベースを変更できない場合 (クライアントがカスケード削除に依存することを明らかに意図していないレガシー システムであるため)、およびバージョンでバグが修正されていない場合は、次の順序を管理する必要があります。 SQL ステートメントを自分で作成します。

SQL ステートメントを手動で管理するという負担 (OpenJPA が実行することになっていることの 1 つ) は、管理者に OpenJPA をアップグレードさせるか、データベース内の外部キー制約を更新させるのに十分な場合があります

この回答よりも良い回答が得られることを心から願っています。

于 2012-05-22T11:19:42.977 に答える