カスケードとインバースの違い
多くのHibernate開発者はカスケードオプションと逆キーワードについて混乱します。いくつかの点では、最初はまったく同じように見えますが、どちらも関係に関連しています。
カスケード対インバース
しかし、カスケードとインバースの間には何の関係もなく、どちらもまったく異なる概念です。
1. inverse
これは、関係を管理する関係所有者を決定するために使用されます(外部キー列の挿入または更新)。
例
この例では、関係所有者はstockDailyRecords(inverse = true)に属しています。
<!-- Stock.hbm.xml --> <hibernate-mapping> <class name="com.mkyong.common.Stock" table="stock" ...> ... <set name="stockDailyRecords" table="stock__daily__record" inverse="true"> <key> <column name="STOCK__ID" not-null="true"/> </key> <one-to-many class="com.mkyong.common.StockDailyRecord"/> </set> ...
在庫オブジェクトを保存または更新すると
session.save(stock); session.update(stock);
Hibernateは、STOCKテーブルの挿入または更新のみを行い、外部キー列の更新は行いません。
2.カスケード
カスケードでは、1つの操作(保存、更新、削除)が行われた後、互いに関係のある別のエンティティに対して他の操作(保存、更新、削除)を呼び出す必要があるかどうかを決定します。
例
この例では、cascade = “save-update”はstockDailyRecordsで宣言されています。
<!-- Stock.hbm.xml --> <hibernate-mapping> <class name="com.mkyong.common.Stock" table="stock" ...> ... <set name="stockDailyRecords" table="stock__daily__record" cascade="save-update" inverse="true"> <key> <column name="STOCK__ID" not-null="true"/> </key> <one-to-many class="com.mkyong.common.StockDailyRecord"/> </set> ...
在庫オブジェクトを保存または更新すると
session.save(stock); session.update(stock);
レコードをSTOCKテーブルに挿入または更新し、StockDailyRecordで別の挿入または更新ステートメント(cascade = “save-update”)を呼び出します。
結論
要するに、 “逆”はどちら側が外部キーを更新するかを決めるのに対し、 “カスケード”は実行される操作によって何が実行されるかを決定します。両方とも関係が非常によく似ていますが、全く異なる2つのことです。 Hibernateの開発者は、その概念を誤解したり誤用したりすると、アプリケーションで深刻なパフォーマンスやデータの完全性の問題が発生するため、研究に時間を費やす価値があります。
リファレンス
{空} 1。
リンク://hibernate/hibernate-cascade-example-save-update-delete-and-delete-orphan/[カスケードの例 – 保存、更新、削除]