This is a cache of http://dbflute.seasar.org/ja/manual/function/ormapper/behavior/update/insertorupdate.html. It is a snapshot of the page at 2024-11-01T00:27:43.750+0000.
insertOrUpdate(entity) | DBFlute

insertOrUpdate(entity)

概要

基本概念

Entityをもとに あれば排他制御ありの更新、なければ登録 をします。

排他制御ありの更新には update()、登録には insert() を利用しています。

このメソッドは、登録と更新でよくある利用を定型化して簡易に利用できるようにしたものであり、このメソッドでなければ実現できないこと、というものはありません。

会話上では、いんさーとおああっぷでーと と表現します。

実装方法

実装の流れ

Behaviorの insertOrUpdate() を呼び出し、Entityを指定します。

e.g. insertOrUpdate()の実装手順 (Eclipseでコード補完) {MEMBER} @Java
memberBhv.inOrU // .inOrU と打って enter
--
memberBhv.insertOrUpdate(member);

Entity に設定されている PK に該当するレコードがDBにあれば更新、なければ登録します。PKが自動採番のとき、Entity に設定されている PK が null なら問答無用で登録します。

ユニークキーで更新 @since 1.0.5G

主キーではなく、ユニーク制約のキーで更新することもできます。

プログラム上でユニークキーだけを持っていて、そのレコードがDBに存在するかどうかわからない場合に、レコード存在確認のためだけの事前検索を省くことができます。 (こういったケースはわりと多いと想定されます)

e.g. ユニークキーである会員アカウントで更新 {MEMBER} @Java
// PK取得のためだけの無駄な事前検索は不要
//Member member = memberBhv.selectEntityWithDeletedCheck(cb);
Member member = new Member();
member.uniqueBy(memberAccount); // ユニークキー (複合キーなら引数が増える)
member.setMemberName("Stojkovic"); // 業務的な更新値の設定
memberBhv.insertOrUpdate(member);

Entity に設定されている (明示的に指定された) ユニークキーがDBにあれば更新、なければ登録します。この場合、ユニークキーの値は必須です。

細かい仕様は、update()と同じです。

メソッド仕様

引数

該当のBehaviorに対応するテーブルのEntityとなります。

nullを指定した場合は例外発生します。 また、更新においてはPKカラムの値と(排他制御が有効の場合に)排他制御カラムの値の指定が必須です(指定なしは例外)。

戻り値

void です。

例外

更新結果が複数件の場合
org.seasar.dbflute.exception.EntityDuplicatedException
予期せぬレコードを更新してしまっている可能性があるため、ロールバックが求められます。
すれ違いがあった場合
org.seasar.dbflute.exception.EntityAlreadyUpdatedException
この例外は、排他制御対象の場合のみ発生します。
this - 排他制御の自動化
一意制約違反があった場合
org.seasar.dbflute.exception.EntityAlreadyExistsException
DBFluteで正式サポートしていない DBMS では、別の例外(SQLFailureException)の可能性があります。

主キー値がなければ登録

指定された Entity に主キー値がなければ問答無用で登録と判断して insert() を実行します。

まずは更新、失敗なら登録

指定された Entity に主キー値が存在する場合、まずは update() を実行します。その結果、(すれ違いでもなく)指定された主キーに対応するレコードが存在しないと判断された場合に insert() を実行します。(登録処理の前にカウント検索が実行されます)

ゆえに、大量のデータを扱う場合、更新が多い方がパフォーマンス的には優位です。