1. ホーム
  2. java

[解決済み] JPAにおけるCascadeType.REMOVEとorphanRemovalの違いは何ですか?

2022-07-27 14:12:38

質問

とはどう違うのでしょうか?

@OneToMany(cascade=REMOVE, mappedBy="customer")
public List<Order> getOrders() { ... }

@OneToMany(mappedBy="customer", orphanRemoval="true")
public List<Order> getOrders() { ... }

この例はJava EE Tutorialに載っているものですが、まだ詳細がわかりません。

どのように解決するのですか?

から ここから :-

<ブロッククオート

カスケード削除

参照フィールドにCascadeType.REMOVE(またはREMOVEを含むCascadeType.ALL.)をマークすることは、削除操作が必要であることを示します。 REMOVE を含む CascadeType.ALL) は、削除操作がそのフィールドによって参照されるエンティティ オブジェクトに自動的にカスケードされる必要があることを示します。 そのフィールドによって参照されるエンティティ・オブジェクトに自動的にカスケードされることを示します。 フィールドによって参照されるエンティティ・オブジェクトに自動的にカスケードされることを示します(1つのコレクション・フィールドによって複数のエンティティ・オブジェクトが参照されることがあります)。 フィールドによって参照される)。

@Entity
class Employee {
     :
    @OneToOne(cascade=CascadeType.REMOVE)
    private Address address;
     :
}

オーファン除去

JPA 2では、より積極的な削除カスケードモードが追加されました。 の orphanRemoval 要素を使用して指定することができます。 要素を用いて指定できます。

@Entity
class Employee {
     :
    @OneToOne(orphanRemoval=true)
    private Address address;
     :
}

違い:-)

2 つの設定の違いは、リレーションシップを切断する際の対応にあります。 リレーションシップを切断したときの対応です。たとえば、次のような場合です。 addressフィールドをNULLにしたり、別のAddressオブジェクトにしたりする場合などです。

  • もし orphanRemoval=true が指定されると、切断されたアドレスのインスタンスは自動的に削除されます。これは 依存オブジェクト (例: Address) を整理するのに便利です。 所有者オブジェクト(例:Employee)からの参照なしに存在してはならない従属オブジェクト(例:Address)を整理するのに便利です。
  • もし cascade=CascadeType.REMOVEです。 が指定されている場合、リレーションシップを切断することは削除ではないので、自動的なアクションは行われません。

    操作ではありません。