web-dev-qa-db-ja.com

休止状態のカスケードとインバースの違いは何ですか?それらは何に使用されますか?

Hibernateでカスケードとインバースを使用する方法は?それらを定義する手順/タグは何ですか?それらは互いに関連しており、どのように有用ですか?

41
Chandra Sekhar

中間テーブルを介した多対多の関係の場合。 「カスケード」は、子テーブルでレコードが作成/更新されるかどうかを示します。一方、「Inverse」は、中間テーブルでレコードが作成/更新されるかどうかを示します

例えば以下のシナリオ1の生徒は複数の電話を持つことができると仮定します。したがって、StudentクラスにはSet of Phonesのプロパティがあります。また、複数の生徒が1台の電話を所有できます。そのため、PhoneクラスにはSet of Studentsのプロパティがあります。このマッピングについては、stud_phoneテーブルで説明されています。

つまり、3つのテーブルがあります。学生、電話、および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 IS 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の場合(つまり、学生が関係の所有者だった場合)、中間テーブルSTUD_PHONEが更新されました。逆が真の場合、電話は関係の所有者であるため、新しい生徒が作成されたとしても、中間テーブルは更新されませんでした。

したがって、2つのエンティティの関係の場合、「カスケード」は他のエンティティテーブルに影響し、「逆」は中間テーブルに影響します。したがって、それらの効果は独立しています。

85
Kaushik Lele

カスケードと逆の間で異なる リンクから参照される情報:

1。 inverse:これは、リレーションシップを管理するリレーションシップオーナー(外部キー列の挿入または更新)を決定するために使用されます。

2。 cascade:カスケードでは、1つの操作(保存、更新、削除)が行われた後、関係を持つ別のエンティティで他の操作(保存、更新、削除)を呼び出す必要があるかどうかを決定しますお互いに。

結論:要するに、「inverse」はどちらの側が外部キーを更新するかを決定し、「cascade」は操作によるフォローの実行を決定します。両方の関係は非常に似ていますが、まったく異なるものです。 Hibernateの開発者は、この概念を誤解したり誤用したりすると、アプリケーションのパフォーマンスやデータ整合性の問題が深刻になるため、時間をかけて調査する価値があります。

このフォーラムのトピックも確認してください: https://forum.hibernate.org/viewtopic.php?f=1t=949041

26
YoK

これらは直交する概念です。

アソシエーションでは、inverse属性またはmappedBy属性(one-to-many/many-to-oneアソシエーションのmanyサイドとmany-to-manyアソシエーションのいずれかのサイド)を使用して、サイドの1つを反転としてマークする必要があります。この情報は、HibernateがJavaクラス(オブジェクト指向関連付け)がどのようにマッピングされるかを正しく判断するために必要です。データベーステーブル(リレーショナルアソシエーション)。

カスケードについては-Hibernateが関連するエンティティで操作を実行するように明示的に指定できます。

  • CascadeType.PERSIST-所有者に対して save() または persist() メソッドが呼び出されると、関連するすべてのエンティティも保存されます。
  • CascadeType.REMOVE- delete() メソッドが所有者に対して呼び出されると、関連するすべてのエンティティも削除されます。
  • CascadeType.MERGE- merge() メソッドが所有者に対して呼び出されると、関連するすべてのエンティティも管理/永続化状態にマージされます。
  • CascadeType.REFRESH-所有者に対して refresh() メソッドが呼び出されると、関連するすべてのエンティティもデータベース表現から更新されます。
  • CascadeType.DETACH-このエンティティが関連付けられたセッションが閉じられると、関連するすべてのエンティティが切り離された状態になります。
  • CascadeType.ALL-すべてのカスケード操作が含まれます。
  • 「孤立した削除」-このエンティティが関係から削除されたときに、関連するエンティティをデータベースから削除します。
4
Aleksey Bykov