2016-07-17 13 views
1

こんにちは、私はあなたがこの質問を私に役立つことを願って @ManyToOneは(フェッチ= FetchType.LAZY、カスケード= CascadeType.MERGE))マージと遅延ロード

メンターが熱望している: @ManyToOne(= FetchType.EAGER、カスケード= CascadeType.MERGE)をフェッチ)

+0

CascadeType.ALL非常に悪い考えです。私の答えを読んでください。一人の生徒が引用しただけなので、全クラスの生徒のメンターを削除したいですか? :) –

答えて

1

カスケードしていない場合は、最初に何も起こりません。あなたの例では、Cascade.Mergeを指定していないので、マージ操作はカスケードされません。

カスケード接続されていると仮定します。あなたの関係がLazyの場合に起こり得るエンティティが初期化されていない場合、カスケードは初期化されていないコレクションに伝播しません。

JPA仕様の後の特定のケースでは、ManyToOneのデフォルトの動作はEAGERです。

汚れている場合、マージがさらに

もう一つのカスケード接続されます汚れている場合には実体が、チェックされます熱望している場合。 ManyToOneのCascadeType.ALLは悪い考えです。 MANY側で1つのエンティティを削除すると、親オブジェクトの削除がトリガーされるためです。私はあなたが本当にこれを望んでいないと信じています。 CascadeType.Allを削除することを強くお勧めします。

+0

これはサンプルコードなので、エンティティまたはコレクションが遅延初期化されている場合、cascade.mergeを使用してもマージは行われません。 – GionJh

+1

Lazyとしてマークされていない限り、ManyToOne側はデフォルトでEAGERです。 –

+0

私はLAZYとしてマークしました: "メンターは怠惰です:@ManyToOne(fetch = FetchType.LAZY、カスケード= CascadeType.MERGE))" – GionJh