272

関係の文脈でカスケードすることの意味を誤解したと思います@ManyToOne

ケース:

public class User {

   @OneToMany(fetch = FetchType.EAGER)
   protected Set<Address> userAddresses;

}

public class Address {

   @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
   protected User addressOwner;

}

の意味は何cascade = CascadeType.ALLですか?たとえば、データベースから特定のアドレスを削除した場合、追加したという事実はデータにどのようにcascade = CascadeType.ALL影響しますか(Userおそらく)?

4

6 に答える 6

429

の意味は、永続性がすべての操作()を関連するエンティティCascadeType.ALLに伝播(カスケード)することです。EntityManagerPERSIST, REMOVE, REFRESH, MERGE, DETACH

Addressを削除すると関連するが削除されるため、あなたの場合は悪い考えのようUserです。ユーザーは複数のアドレスを持つことができるため、他のアドレスは孤立します。ただし、逆の場合(に注釈を付けるUser)は理にかなっています。アドレスが1人のユーザーのみに属している場合、このユーザーが削除された場合、ユーザーに属するすべてのアドレスの削除を伝播しても安全です。

ところで:結合列がADDRESSテーブルにあるべきであることを永続性プロバイダーに通知するために、mappedBy="addressOwner"属性を追加したい場合があります。User

于 2012-10-23T09:33:44.997 に答える
80

エンティティの状態遷移は親エンティティから子エンティティに伝播する必要があり、その逆ではないためCascadeType.ALL、onを使用しないでください。@ManyToOne

基になる外部キー列をマップするため、@ManyToOneサイドは常に子アソシエーションです。

したがって、を関連付けからCascadeType.ALLサイドに移動する必要があります。これは、最も効率的な1対多のテーブル関係マッピングであるため、属性も使用する必要があります。@ManyToOne@OneToManymappedBy

于 2017-08-10T12:14:15.433 に答える
57

OpenJPAドキュメントの例については、ここを参照してください。CascadeType.ALLすべてのアクションを実行することを意味します。

引用:

CascadeType.PERSIST:エンティティを永続化する場合、そのフィールドに保持されているエンティティも永続化します。EntityManagerがフラッシュ中に新しいエンティティを参照するフィールドを見つけ、そのフィールドがCascadeType.PERSISTを使用しない場合、それはエラーであるため、このカスケードルールを自由に適用することをお勧めします。

CascadeType.REMOVE:エンティティを削除すると、このフィールドに保持されているエンティティも削除されます。

CascadeType.REFRESH:エンティティを更新するときに、このフィールドに保持されているエンティティも更新します。

CascadeType.MERGE:エンティティの状態をマージするときに、このフィールドに保持されているエンティティもマージします。

セバスチャン

于 2012-10-23T09:27:27.393 に答える
21

EJB3.0仕様から

カスケード注釈要素の使用は、操作の効果を関連するエンティティに伝播するために使用できます。カスケード機能は、通常、親子関係で使用されます。

Xが管理対象エンティティの場合、削除操作によってXが削除されます。Xからこれらの他のエンティティへの関係にcascade=REMOVEまたはcascade=ALLアノテーション要素値のアノテーションが付けられている場合、削除操作はXによって参照されるエンティティにカスケードされます。

つまり、で定義されたエンティティリレーションシップCascadeType.Allは、親で発生する永続化、更新、マージ、削除などのすべての永続化イベントが子に渡されることを保証します。他のオプションを定義CascadeTypeすると、開発者はエンティティの関連付けが永続性を処理する方法をよりきめ細かく制御できます。

たとえば、ページのリストを含むオブジェクトBookがあり、このリスト内にページオブジェクトを追加したとします。@OneToManyブックとページの関連付けを定義する注釈がとしてマークされている場合CascadeType.All、ブックを永続化すると、ページもデータベースに永続化されます。

于 2012-10-23T09:32:59.413 に答える
13

JPA 2.0では、アドレスをユーザーエンティティから削除した場合に削除する場合は、にorphanRemoval=true(の代わりにCascadeType.REMOVE)追加できます@OneToMany

orphanRemoval=trueとの間の詳細な説明CascadeType.REMOVEここにあります。

于 2015-08-06T08:55:17.383 に答える
6

ユーザーに割り当てられたアドレスを削除し、ユーザーエンティティクラスに影響を与えたくない場合は、次のようなことを試してください。

@Entity
public class User {
   @OneToMany(mappedBy = "addressOwner", cascade = CascadeType.ALL)
   protected Set<Address> userAddresses = new HashSet<>();
}

@Entity 
public class Addresses {
   @ManyToOne(cascade = CascadeType.REFRESH) @JoinColumn(name = "user_id")
   protected User addressOwner;
}

このようにして、アノテーションでフェッチを使用することを心配する必要はありません。ただし、ユーザーを削除するときは、ユーザーオブジェクトへの接続アドレスも削除することに注意してください。

于 2019-01-19T18:32:04.433 に答える