JPA と Hibernate におけるpersist() と merge() の違いを理解する
オブジェクト リレーショナル マッピングの領域では、JPA ( Java Persistence API) とその実装 Hibernate は、データベース内のエンティティを管理するための重要なメソッドを提供します。 2 つの重要なメソッド、persist() と merge() は、エンティティの永続化と更新の処理において異なる役割を果たします。
persist() の機能
persist() は、次の中で動作します。次の方法:
- 新しいエンティティの場合、永続化プロセスが開始され、管理対象エンティティになります。エンティティをデータベースに追加する INSERT クエリを生成します。
- エンティティが管理対象エンティティとしてすでに存在する場合、persist() はそれを無視しますが、cascade=PERSIST または cascade=ALL アノテーションを使用して参照エンティティに操作をカスケードします。 .
- 削除されたエンティティをデータベースに再挿入します。
merge() の仕組み
merge() には別の機能があります。アプローチ:
- 分離されたエンティティをマージすると、そのエンティティの新しいマネージド コピーが作成されるか、同じ ID を持つ既存のマネージド インスタンスが更新されます。
- 新しいエンティティの場合、merge( ) は、新しいマネージド インスタンスを作成し、その状態をそこにコピーします。
- エンティティが削除済みとしてマークされている場合、merge() は例外をスローします。
- マネージド エンティティは無視されますが、参照先への操作はカスケードされます。 cascade=MERGE または cascade=ALL アノテーションを持つエンティティ。
- マージは、変更されたエンティティによって参照されるエンティティのカスケード操作を再帰的にアクティブ化します。
詳細な JPA 仕様
JPA 仕様では、次の操作のセマンティクスの概要が明確に説明されています。
persist() の場合
-
新しいエンティティ: トランザクションのコミットまたはフラッシュ中にエンティティをデータベースに入力します。
-
既存の管理対象エンティティ: 無視されますが、cascade=PERSIST または cascade=ALL の注釈が付けられた参照エンティティにカスケードされます。
-
削除されたエンティティ: 管理対象になります。
-
分離されたオブジェクト: 呼び出し中、またはその後のフラッシュ/コミット時に EntityExistsException をスローする可能性があります。
merge() の場合
-
分離されたエンティティ: 既存または新しく作成された管理対象エンティティ インスタンスにその状態をコピーします。
-
新しいエンティティ: コピーされた状態で新しい管理対象エンティティ インスタンスを作成します。
-
削除されたエンティティ: IllegalArgumentException が発生します。
-
管理対象エンティティ: 無視されますが、cascade=MERGE または cascade=ALL の注釈が付けられた参照エンティティに操作をカスケードします。
persist() と merge() の微妙な違いを理解することは、効果的なエンティティ管理とデータ操作にとって重要です。 JPA および Hibernate アプリケーションで。
以上が## JPA および Hibernate で `persist()` と `merge()` を使用する場合: エンティティの永続化と更新に関するガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。