22.3. ライフサイクルのカスケード


明示的に save() をコールするのは面倒ですが、カスケードを使って対処することができます
<set name="children" inverse="true" cascade="all">
    <key column="parent_id"/>
    <one-to-many class="Child"/>
</set>
Copy to Clipboard Toggle word wrap
これにより先ほどのコードを以下のように単純化します:
Parent p = (Parent) session.load(Parent.class, pid);
Child c = new Child();
p.addChild(c);
session.flush();
Copy to Clipboard Toggle word wrap
同様に Parent を保存または削除するときに、子を一つずつ反復して扱う必要はありません。以下は p を削除し、そしてデータベースからその子をすべて削除します。
Parent p = (Parent) session.load(Parent.class, pid);
session.delete(p);
session.flush();
Copy to Clipboard Toggle word wrap
しかし、以下のコードは:
Parent p = (Parent) session.load(Parent.class, pid);
Child c = (Child) p.getChildren().iterator().next();
p.getChildren().remove(c);
c.setParent(null);
session.flush();
Copy to Clipboard Toggle word wrap
データベースから c を削除しません。この場合、 p へのリンクを削除するのみで、NOT NULL 制約違反を引き起こします。明示的にChilddelete()する必要があります。
Parent p = (Parent) session.load(Parent.class, pid);
Child c = (Child) p.getChildren().iterator().next();
p.getChildren().remove(c);
session.delete(c);
session.flush();
Copy to Clipboard Toggle word wrap
今このケースでは実際に Child が親なしでは存在できないようになりました。そのため、コレクションから Child を取り除く場合、これも削除します。そのためには cascade="all-delete-orphan" を使わなければなりません。
<set name="children" inverse="true" cascade="all-delete-orphan">
    <key column="parent_id"/>
    <one-to-many class="Child"/>
</set>
Copy to Clipboard Toggle word wrap
コレクションのマッピングで inverse="true" と指定しても、コレクションの要素の反復によって、依然カスケードが処理されます。そのため、カスケードでオブジェクトを保存、削除、更新する必要がある場合は、それをコレクションに追加しなければなりません。単に setParent() を呼ぶだけでは不十分です。
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat