JPA と Hibernate の Persist() と Merge() の違いを理解する
JPA と Hibernate では、persist() と merge () メソッドは、エンティティの管理とデータの永続性の処理において重要な役割を果たします。ただし、それらの動作には明確な違いがあります。
Persist()
JPA 仕様で定義されているpersist() メソッドは、次のように動作します。
- エンティティが新規で管理されていない場合は、管理対象となり、トランザクションがコミットまたはフラッシュされるときにデータベースに保存されます。
- エンティティがすでに管理または削除されている場合、操作は無視されます。
- エンティティが切り離されている場合、例外がスローされるか、フラッシュまたはコミット時に永続化操作が失敗する可能性があります。
- カスケード操作は、次のいずれかの参照エンティティに適用されます。 cascade=PERSIST または cascade=ALL annotations.
Merge()
一方、merge() メソッドには異なるセマンティクスのセットがあります。
- エンティティが切り離された場合、その状態は同じ ID を持つ既存の管理対象エンティティにコピーされるか、新しい管理コピーが作成されます。
- エンティティが新しい場合を実行すると、新しい管理対象エンティティが作成され、その状態が受信エンティティからコピーされます。
- エンティティが削除されると、例外がスローされます。
- エンティティが管理されている場合、操作は無視されますただし、cascade=MERGE または cascade=ALL の注釈が付けられている場合、カスケード操作は参照エンティティに引き続き適用されます。
- マージされたエンティティは、cascade=MERGE または cascade=ALL の注釈が付けられたすべての関係の管理エンティティを参照します。
- エンティティが非カスケード関係への参照とマージされる場合、マージされたエンティティからの関連付けは、同じ ID を持つ管理オブジェクトへの参照を返します。
時Persist() または Merge() を使用するかどうか
これらの違いに基づいて、次のガイドラインは適切な方法を選択するのに役立ちます。
- 必要な場合はpersist()を使用してください。新しいエンティティを作成するか、永続コンテキストによってまだ管理されていない既存のエンティティを更新します。
- すでに管理されているが永続コンテキストの外で変更された既存のエンティティを更新する場合は、merge() を使用します。 .