[解決済み] JPAとHibernateのpersist()とmerge()の違いは何ですか?
質問
Hibernateのpersist()とmerge()の違いは何ですか?
persist()
はUPDATE & INSERTクエリを作成することができます、例えば。
SessionFactory sef = cfg.buildSessionFactory();
Session session = sef.openSession();
A a=new A();
session.persist(a);
a.setName("Mario");
session.flush();
この場合 クエリ はこのように生成されます。
Hibernate: insert into A (NAME, ID) values (?, ?)
Hibernate: update A set NAME=? where ID=?
だから
persist()
メソッドは
を生成します。
を生成します。
では
merge()
:
SessionFactory sef = cfg.buildSessionFactory();
Session session = sef.openSession();
Singer singer = new Singer();
singer.setName("Luciano Pavarotti");
session.merge(singer);
session.flush();
データベースにはこのように表示されています。
SINGER_ID SINGER_NAME
1 Ricky Martin
2 Madonna
3 Elvis Presley
4 Luciano Pavarotti
では、レコードを更新するには
merge()
SessionFactory sef = cfg.buildSessionFactory();
Session session = sef.openSession();
Singer singer = new Singer();
singer.setId(2);
singer.setName("Luciano Pavarotti");
session.merge(singer);
session.flush();
データベースにはこのように表示されています。
SINGER_ID SINGER_NAME
1 Ricky Martin
2 Luciano Pavarotti
3 Elvis Presley
どのように解決するのですか?
JPA仕様 には、これらの操作のセマンティクスに関する非常に正確な記述があり、javadocよりも優れています。
のセマンティクスは を持続させる 操作をエンティティXに適用した場合のセマンティクスは である。
Xが新しいエンティティである場合、それは が管理されるようになります。エンティティXは トランザクションコミット時またはその前にデータベースに トランザクションコミットまたは フラッシュ操作の結果としてデータベースに入力されます。
もしXが が既存のマネージドエンティティである場合、それは persist オペレーションによって無視されます。 しかし、persist操作は はXによって参照されるエンティティにカスケードされる。 Xからこれらのエンティティへの関係が 他のエンティティへの関係が
cascade=PERSIST
またはcascade=ALL
アノテーション要素の値、または と等価なXML記述子 要素で指定されます。Xが削除されたエンティティである場合。 は管理されるようになります。
もしXが を切り離した場合
EntityExistsException
が投げられるかもしれません。 がスローされます。 あるいはEntityExistsException
または 別のPersistenceException
が投げられるかもしれません。 はフラッシュ時やコミット時に投げられます。に対して によって参照されるすべてのエンティティYが Xからのリレーションシップによって参照されるすべてのエンティティYについて、もし Yへのリレーションシップがアノテーションされている場合 カスケード要素の値で
cascade=PERSIST
またはcascade=ALL
であれば の場合,Yにpersist操作が適用される。
のセマンティクスは マージ 操作 をエンティティXに適用した場合のセマンティクスは以下の通りである。
Xがデタッチドエンティティである場合、Xの状態 Xの状態が既存の の管理下エンティティインスタンスX'にコピーされる。 またはXの新しい管理されたコピーX' が作成されます。
Xが新しいエンティティ インスタンスである場合、新しい管理対象エンティティ インスタンスX'が作成され、Xの状態が Xの状態が新しいマネージドエンティティインスタンスX' にコピーされる。 エンティティインスタンスX'にコピーされます。
もしXが 削除されたエンティティインスタンスであれば
IllegalArgumentException
が投げられます。 が投げられる(または、トランザクションのコミットが失敗する)。 トランザクションコミットが失敗します)。もしX が管理されたエンティティである場合、それはマージ操作によって無視されます。 は無視されますが にカスケードされます。 関係によって参照されるエンティティ Xからの関係によって参照されるエンティティにカスケードされます。 でアノテーションされている場合、マージ操作はX からの関係によって参照されるエンティティにカスケードされます。 要素値
cascade=MERGE
またはcascade=ALL
のアノテーションを使用します。すべての 関係によって参照されるすべてのエンティティY カスケード要素を持つXからの 値
cascade=MERGE
またはcascade=ALL
, Y はY'として再帰的にマージされる。Xによって参照されるすべての Xによって参照されるすべてのそのようなYに対して、X'は を参照するように設定される。(ただし、Xが が管理されている場合、Xは X'.)XがX'にマージされたエンティティである場合、X', を、別のエンティティYへの参照とする。 ここで
cascade=MERGE
またはcascade=ALL
が指定されていない場合 が指定されていない場合、X'からの同じアソシエーションのナビゲーションは X'から同じアソシエーションのナビゲーションを行うと を持つマネージドオブジェクトY'への参照が得られる。 への参照が生成されます。
関連
-
[解決済み] Spring Data JPAにおけるCrudRepositoryとJpaRepositoryのインターフェースの違いは何ですか?
-
BindException: アドレスはすでに使用中です:バインドエラー解決
-
コンストラクタDate()が未定義である問題
-
CAS 5.1.8でhttpをサポートし、認証されていない認可サービスエラーのプロンプトが表示される問題を解決した。
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] ORM(Object-Relational Mapping)における「N+1 selects問題」とは?
-
[解決済み] StringBuilderとStringBufferの違いについて
-
[解決済み] JPA EntityManager。なぜmerge()ではなくpersist()を使うのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
実行中にEclipseがポップアップする A Java Exception has occurred
-
Eclipse問題 アクセス制限。タイプ 'SunJCE' が API でないことを解決し、/jdk ディレクトリにある /jre と jre の違いについて理解を深める。
-
強制型変換について
-
無効なメソッド宣言
-
Junitのユニットテストはjava.lang.Testを報告します。
-
Javaがテキストファイルを読み込む
-
X11 DISPLAY変数が設定されていない」問題の解決方法
-
代入の左辺は変数でなければならない 解答
-
[解決済み] JPA EntityManager。なぜmerge()ではなくpersist()を使うのか?
-
[解決済み】Hibernateの各保存方法の違いは何ですか?