の違いは何ですか
@OneToMany(cascade=REMOVE, mappedBy="customer")
public List<Order> getOrders() { ... }
そして
@OneToMany(mappedBy="customer", orphanRemoval="true")
public List<Order> getOrders() { ... }
この例はJava EEチュートリアルのものですが、詳細はまだわかりません。
ここ :-から
カスケード削除
CascadeType.REMOVE(またはREMOVEを含むCascadeType.ALL)を使用して参照フィールドをマークすると、削除操作をそのフィールドによって参照されるエンティティオブジェクトに自動的にカスケードする必要があることを示します(複数のエンティティオブジェクトはコレクションフィールドによって参照できます)。
@Entity class Employee { : @OneToOne(cascade=CascadeType.REMOVE) private Address address; : }
孤立した削除
JPA 2は、追加のより積極的な削除カスケードモードをサポートしています。これは、@ OneToOneおよび@OneToManyアノテーションのorphanRemoval要素を使用して指定できます。
@Entity class Employee { : @OneToOne(orphanRemoval=true) private Address address; : }
違い:-
2つの設定の違いは、関係の切断に対する応答にあります。たとえば、住所フィールドをnullまたは別のAddressオブジェクトに設定する場合など。
- orphanRemoval = trueが指定されている場合、切断されたAddressインスタンスは自動的に削除されます。これは、所有者オブジェクト(従業員など)からの参照なしでは存在してはならない依存オブジェクト(アドレスなど)をクリーンアップするのに役立ちます。
- cascade = CascadeType.REMOVEのみが指定されている場合、関係の切断は削除ではないため、自動アクションは実行されません。
操作。
CascadeType.REMOVE
とorphanRemoval=true
の違いを理解する簡単な方法。
孤立した削除の場合:setOrders(null)
を呼び出すと、関連するOrder
エンティティがdbから自動的に削除されます。
カスケードの削除の場合:setOrders(null)
を呼び出すと、関連するOrder
エンティティがNOT dbから自動的に削除されます。
子エンティティと親エンティティがあるとします。親は複数の子を持つことができます。
@Entity
class parent {
//id and other fields
@OneToMany (orphanRemoval = "true",cascade = CascadeType.REMOVE)
List<Personnel> myChildernList;
}
orphanRemovalはORMの概念であり、子が孤立しているかどうかを示します。また、データベースから削除する必要があります。
親からアクセスできない場合、子は孤立します。たとえば、インデックスiでobjを削除(myChildernList.remove(i)を使用)するか、nullに設定するか、新しいものに置き換えた場合(personnelList.set(i、newChild))、親はその子にアクセスできなくなりますまた、子は孤立しているため、子はデータベースからも削除される運命にあります(つまり、ハートブレイク:()
CascadeType.REMOVEはデータベースレベルの概念であり、親が削除されたかどうか、子テーブル内のすべての関連レコードを削除する必要があることを示します。
実際には、違いはデータを更新しようとしているか(PATCH)、データを完全に置き換えようとしているか(PUT)にあります。
customer
を削除すると、cascade=REMOVE
を使用することで、意図的で有用と思われる顧客の注文も削除されます。
@OneToMany(cascade=REMOVE, mappedBy="customer")
public List<Order> getOrders() { ... }
customer
をorphanRemoval="true"
で更新すると、以前のすべての注文が削除され、提供された注文に置き換えられます。 (REST API
に関してPUT
)
@OneToMany(mappedBy="customer", orphanRemoval="true")
public List<Order> getOrders() { ... }
orphanRemoval
がなければ、古い注文が保持されます。 (REST API
に関してPATCH
)