insertOrUpdateNonstrict(entity)
概要
基本概念
Entityをもとに あれば排他制御なしの更新、なければ登録 をします。
排他制御なしの更新には updateNonstrict()、登録には insert() を利用しています。
このメソッドは、登録と更新でよくある利用を定型化して簡易に利用できるようにしたものであり、このメソッドでなければ実現できないこと、というものはありません。
会話上では、いんさーとおああっぷでーとのんすとりくと と表現します。
実装方法
実装の流れ
Behaviorの insertOrUpdateNonstrict() を呼び出し、Entityを指定します。
e.g. update()の実装手順 (Eclipseでコード補完) {MEMBER} @Java
memberBhv.inOrUN // .inOrUN と打って enter
--
memberBhv.insertOrUpdateNonstrict(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.insertOrUpdateNonstrict(member);
Entity に設定されている (明示的に指定された) ユニークキーがDBにあれば更新、なければ登録します。この場合、ユニークキーの値は必須です。
細かい仕様は、update()と同じです。
メソッド仕様
引数
該当のBehaviorに対応するテーブルのEntityとなります。
nullを指定した場合は例外発生します。 また、更新においてはPKカラムの値の指定が必須です(指定なしは例外)。
戻り値
void です。
例外
- 更新結果が複数件の場合
- org.seasar.dbflute.exception.EntityDuplicatedException
- 予期せぬレコードを更新してしまっている可能性があるため、ロールバックが求められます。
- 一意制約違反があった場合
- org.seasar.dbflute.exception.EntityAlreadyExistsException
- DBFluteで正式サポートしていない DBMS では、別の例外(SQLFailureException)の可能性があります。
主キー値がなければ登録
指定された Entity に主キー値がなければ問答無用で登録と判断して insert() を実行します。
まずは更新、失敗なら登録
指定された Entity に主キー値が存在する場合、まずは updateNonstrict() を実行します。その結果、指定された主キーに対応するレコードが存在しない場合に insert() を実行します。 (登録処理の前にカウント検索が実行されます)
ゆえに、大量のデータを扱う場合、更新が多い方がパフォーマンス的には優位です。