ハイバネートでカスケードとインバースを使用するには? それらを定義する手順/タグは何ですか? それらは互いに関連しており、どのように役立ちますか?
3 に答える
中間テーブルを介した多対多の関係の場合。「カスケード」は、子テーブルでレコードが作成/更新されるかどうかを示します。一方、「逆」は、中間テーブルでレコードが作成/更新されるかどうかを示します
たとえば、以下のシナリオ1の学生が複数の電話を持つことができると仮定します。したがって、Studentクラスには一連の電話のプロパティがあります。また、1台の電話を複数の学生が所有できます。したがって、PhoneクラスにはSetofStudentのプロパティがあります。このマッピングは、stud_phoneテーブルに記載されています。
つまり、3つのテーブルがあります。Student、Phone、およびstud_phone(中間)テーブル。マッピングは次のようになります。
<set name="phoneset" table="stud_phone" cascade="save-update" inverse="true">
<key column="mapping_stud_id">< /key>
<many-to-many class="com.domain.Phone" column="mapping_phon_id"/>
</set>
新しい学生オブジェクトが作成され、2つの新しい電話オブジェクトがそのセットに追加されます。そしてsession.save(student_obj)
と呼ばれます。「カスケード」と「逆」の設定に応じて、異なるクエリが実行されます。
以下は、カスケードとインバースのさまざまな組み合わせとその影響です。
1)CASCADEはNONEであり、INVERSEはfalseです。
Hibernate: insert into STUDENT (Name, stud_id) values (?, ?)
Hibernate: insert into stud_phone (mapping_stud_id, mapping_phon_id) values (?, ?)
Hibernate: insert into stud_phone (mapping_stud_id, mapping_phon_id) values (?, ?)
2)CASCADEはNONEであり、INVERSEはtrueです。
Hibernate: insert into STUDENT (Name, stud_id) values (?, ?)
3)CASCADEは保存更新であり、INVERSEはfalseです
Hibernate: insert into STUDENT (Name, stud_id) values (?, ?)
Hibernate: insert into phone (phone_num, phone_id) values (?, ?)
Hibernate: insert into phone (phone_num, phone_id) values (?, ?)
Hibernate: insert into stud_phone (mapping_stud_id, mapping_phon_id) values (?, ?)
Hibernate: insert into stud_phone (mapping_stud_id, mapping_phon_id) values (?, ?)
4)CASCADEはsave-updateであり、INVERSEはtrueです
Hibernate: insert into STUDENT (Name, stud_id) values (?, ?)
Hibernate: insert into phone (phone_num, phone_id) values (?, ?)
Hibernate: insert into phone (phone_num, phone_id) values (?, ?)
ご覧のとおり、CASCADEが保存更新された場合にのみ、レコードはPHONEテーブルにも作成されました。そうでなければそうではありません。
INVERSEがfalseの場合(つまり、Studentがリレーションシップの所有者である場合)、中間テーブルSTUD_PHONEが更新されました。逆が真の場合、電話は関係の所有者であるため、新しい学生が作成されても、中間テーブルは更新されませんでした。
したがって、2つのエンティティの関係の場合、「カスケード」は他のエンティティテーブルに影響を与え、「逆」は中間テーブルに影響を与えます。したがって、それらの効果は独立しています。
カスケードと逆リンクの違いから参照された情報:
1. inverse:これは、どちらの側が関係を管理する関係所有者であるかを決定するために使用されます (外部キー列の挿入または更新)。
2. カスケード:カスケードでは、1 つの操作 (保存、更新、および削除) が完了した後、互いに関係を持つ別のエンティティに対して他の操作 (保存、更新、および削除) を呼び出す必要があるかどうかを決定します。
結論:要するに、「逆」はどちらの側が外部キーを更新するかを決定し、「カスケード」は次の操作を実行する必要があるかを決定します。両者の関係はよく似ていますが、まったく別物です。Hibernate の開発者は、時間をかけて調査する価値があります。概念を誤解したり、誤用したりすると、アプリケーションに深刻なパフォーマンスやデータの整合性の問題が発生するからです。
このフォーラムのトピックも確認してください: https://forum.hibernate.org/viewtopic.php?f=1&t=949041