ホームページ  >  記事  >  Java  >  ## Persist() と Merge(): どの JPA メソッドをいつ使用する必要がありますか?

## Persist() と Merge(): どの JPA メソッドをいつ使用する必要がありますか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-27 01:44:02793ブラウズ

##  Persist() vs. Merge(): When Should You Use Which JPA Method?

JPA と Hibernate のpersist() と merge() の違いを調べる

データ永続性の分野では、JPA (Java Persistence) API) と Hibernate は重要な役割を果たします。その核となるのは、データベースのコンテキストでオブジェクトを管理するための 2 つの基本的なメソッド、persist() と merge() です。

persist()

persist()このメソッドは主に、データベース内に新しいエンティティを作成するか、既存のエンティティを更新する役割を果たします。その動作はエンティティの状態に応じて異なります。

  • エンティティが新しい (まだ永続化されていない) 場合、persist() はそれをデータベースに挿入し、識別子を割り当てます。
  • エンティティが管理されている (すでに永続化されている) 場合、persist() はそれを無視するか、cascade 属性を使用して構成されている場合は関連エンティティに操作をカスケードします。
  • エンティティがデタッチされている (コンテキストから削除されている) 場合、例外がスローされる可能性があります。

二重の機能を示すpersist()の使用例:

SessionFactory sef = cfg.buildSessionFactory();
Session session = sef.openSession();
A a = new A();
session.persist(a);
a.setName("Mario");
session.flush();

このシナリオでは、persist()は最初に「A」を挿入します。

merge()

persist() とは異なり、merge() はエンティティの状態をマージすることだけに焦点を当てています。分離されたエンティティを管理されたエンティティに変換します。その動作はもう少し単純です。

  • デタッチされたエンティティが新しいエンティティを表す場合、マネージド コピーが作成され、その状態がコピーされます。
  • デタッチされたエンティティが既存のエンティティを表す場合エンティティを削除すると、その状態が一致する管理対象エンティティにコピーされます。
  • デタッチされたエンティティが削除されたエンティティを表す場合、例外がスローされます。
  • デタッチされたエンティティに cascade= の注釈が付けられた関係がある場合MERGE または cascade=ALL の場合、これらの関連エンティティは再帰的にマージされます。

merge() を使用した例は、その操作を示しています。

SessionFactory sef = cfg.buildSessionFactory();
Session session = sef.openSession();
Singer singer = new Singer();
singer.setName("Luciano Pavarotti");
session.merge(singer);
session.flush();

実行後、提供された Singer オブジェクトは次のようになります。既存または新しく作成された管理対象エンティティにマージされ、それぞれのデータベースが変更されます。

結論

Persist() と merge() は、JPA と冬眠します。 persist() は挿入と更新の両方の操作を可能にしますが、merge() は切り離されたエンティティを管理対象エンティティにマージするために特別に調整されています。データベース駆動型アプリケーションでエンティティを効果的に管理するには、それらの異なる動作を理解することが不可欠です。

以上が## Persist() と Merge(): どの JPA メソッドをいつ使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。