多くの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/[カスケードの例 – 保存、更新、削除]