updateNonstrict(entity)

概要

基本概念

Entityをもとに 排他制御なし一件更新 をします。Nonstrict の strict は、排他制御のことです。主に、排他制御の不要なバッチ処理などで利用されます。

会話上では、あっぷでーとのんすとりくと と表現します。文脈上、排他制御の有無を強調したい場合は 排他制御なしのあっぷでーと などと言うとわかりやすいでしょう。

実装方法

実装の流れ

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

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

排他制御が不要なため、PKの値が設定されていれば更新ができます。

e.g. Entityに対して更新値を設定して更新 {MEMBER, memberId=3} @Java
Member member = new Member();
member.setMemberId(3);
member.setMemberName("Stojkovic");
memberBhv.updateNonstrict(member);

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

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

プログラム上でPKは持ってなくて代わりにユニークキーだけを持っているような場合に、PK取得のためだけの無駄な事前検索を省くことができます。 (こういったケースはわりと多いと想定されます)

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

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

排他制御をしないのであれば、queryUpdate() で更新するのとやってることはほぼ同じです。 (実行して対象のレコードが存在しなかったときに例外になるか素通りするかの違いはあります)

メソッド仕様

引数

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

nullを指定した場合は例外発生します。また、PKカラムの値の指定は必須です(指定なしは例外)。

戻り値

void です。

例外

更新対象が存在しなかった場合
org.seasar.dbflute.exception.EntityAlreadyDeletedException
この例外は、指定された主キーに対応するレコードが存在しなかった場合に発生します。 業務的に存在することが前提の更新であれば、開発時はバグ・データ不備、結合テスト・運用時はすれ違いと捉えることができます。
更新結果が複数件の場合
org.seasar.dbflute.exception.EntityDuplicatedException
予期せぬレコードを削除してしまっている可能性があるため、ロールバックが求められます。
一意制約違反があった場合
org.seasar.dbflute.exception.EntityAlreadyExistsException
DBFluteで正式サポートしていない DBMS では、別の例外(SQLFailureException)の可能性があります。

設定された値だけ更新

update(entity) と同じ仕様です。

排他制御カラムは自動更新

排他制御の処理自体は行われませんが、排他制御カラムは自動更新されます。例えば、バージョン番号は DB上の値にSQL上でインクリメント(+1)された値で更新 されます。よって、このメソッドを使った更新(の事実)を、(排他制御が必要な)別の更新の排他制御にしっかり伝えることができます。

更新後の Entity には、(インクリメントされた)その値は格納されません。 更新前に排他制御カラムに(Entityに)設定された値は、利用されないだけでなく更新後にそのまま残っています。

e.g. 排他制御カラムの値は自動更新 {MEMBER,memberId=3} @Java
Member member = new Member();
member.setMemberId(3);
member.setMemberName("Stojkovic");
memberBhv.update(member);
// update MEMBER
//    set MEMBER_NAME = 'Stojkovic'
//      , VERSION_NO = VERSION_NO + 1
//  where MEMBER_ID = 3

バージョン番号の更新方法と更新後のEntityでの状態が update(entity) とは変わります。 updateNonstrict() は、主に事前検索なしでの更新を想定しているため、更新前のEntityにバージョン番号を設定されないことを前提としているためです。 ほとんどの場合において、この違いを意識する必要はないと想定されますが、 更新後のEntityをさらに続けて利用して、バージョン番号も意識した処理を行うような場合は注意して下さい。

共通カラムの自動設定

update(entity) と同じ仕様です。

カスケードはしません

update(entity) と同じ仕様です。

Entity更新のスコープ

update(entity) と同じ仕様です。