3

JPA 接続エンティティを含む複雑なオブジェクト グラフがあります。親を削除すると、削除が子に正しくカスケードされます。

次に、(1 対 1 の関係を熱心に読み込まないように) 親クラスをインストルメント化します。削除すると、参照整合性違反の例外が発生します。フラッシュ時のクエリの休止状態の問題を見ると、休止状態が実際に間違った順序でレコードを削除しようとしていることがわかります。したがって、データベースは参照整合性について不平を言い、例外がスローされます。

これは、エンティティがインストルメント化されている場合にのみ現れるのはなぜですか? カスケード削除の順序を変更する方法はありますか?

4

1 に答える 1

1

あなたの質問に対する答えはありませんが...なぜ「インストルメンテーション」をいじって、1対1の関連付けを遅延ロードするのですか? Fooクラスとその間の 1 対 1 の関連付けについて、以下をテストしましたFooDetail

@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
public FooDetail getFooDetail() {
    return detail;
}

そして、遅延読み込みはうまくいきます。Fooこれは、インスタンスを取得するときに実行されるステートメントです。

ハイバネート: foo0_.id=?

そして、後でゲッターを呼び出すと、FooDetailがフェッチされます。

Hibernate: FooDetail foodetail0_ から id46_0_ として foodetail0_.id、fullName46_0_ として foodetail0_.fullName を選択します。

Fooまた、特定のインスタンスの削除も正常に機能し、ステートメントは正しい順序で実行されます。

Hibernate: id=? の Foo から削除
Hibernate: id=? の FooDetail から削除

以下は、参照用の対応するテーブルに対して Hibernate によって生成された DDL です。

テーブル Foo を作成します (id bigint not null、shortName varchar(255)、detail_id bigint、主キー (id))
テーブル FooDetail を作成します (id bigint not null、fullName varchar(255)、主キー (id))
テーブル Foo の変更 制約の追加 FK212C3F68B31178 外部キー (detail_id) 参照 FooDetail

Hibernate Annotations 3.4.0.GA でテスト済み。

更新:これがあなたが探しているものでない場合は、1 対多の関連付けを使用してください。1 対 1 の関連付けには制限があります (質問を明確にしてください。読者はあなたが何をしていないかを推測できません)。書き込みません)。

于 2010-02-25T20:01:26.283 に答える