メニュー


Cayenne test page

このページは、テスト用のページです。

INSERT new objects

DDL:
CREATE TABLE "APP"."LOG" (
       "LOGID" INTEGER NOT NULL
     , "MESSAGE" VARCHAR(30) NOT NULL
     , "TIMESTAMP" TIMESTAMP DEFAULT CURRENT TIMESTAMP
);
CREATE SEQUENCE APP.S_LOG START WITH 200
 INCREMENT BY 20 NO MAXVALUE  NO CYCLE  CACHE 20;

ソースコード:
Log j1 = new Log();
j1.setMessage("TEST 1 LOG");
ctx.registerNewObject(j1);

Log j2=(Log)ctx.createAndRegisterNewObject(Log.class);
j2.setMessage("Test2 register and new");

結果:
INFO QueryLogger: +++ Connecting: SUCCESS.
INFO QueryLogger: Detected and installed adapter: org.objectstyle.cayenne.dba.db2.DB2Adapter
INFO QueryLogger: SELECT NEXTVAL FOR APP.S_LOG FROM SYSIBM.SYSDUMMY1
INFO QueryLogger: --- transaction started.
INFO QueryLogger: --- will run 1 query.
INFO QueryLogger: INSERT INTO APP.LOG (LOGID, MESSAGE, TIMESTAMP) VALUES (?, ?, ?)
INFO QueryLogger: [bind: 200, 'Test2 register and new', NULL]
INFO QueryLogger: === updated 1 row.
INFO QueryLogger: [bind: 201, 'TEST 1 LOG', NULL]
INFO QueryLogger: === updated 1 row.
INFO QueryLogger: +++ transaction committed.

DB2での結果:

LOGID       MESSAGE                        TIMESTAMP
        200 Test2 register and new         -
        201 TEST 1 LOG                     -

メモ:
  • この例ではIDが付く順が逆になっているが、その後テストした際は常に先にregister()したDataObjectから順にINSERTされた時もあった。順番は不定なのかもしれない
  • NULLのプロパティに対応する列には明示的にNULLがINSERTされるため、列定義でDEFAULTを列に付けていても機能しない
  • 一度NEXTVALでシーケンスの値を取り込んでいるが、二回目は取り込んでいない(一度NEXTVALを取ったら20回分は内部で作成するため。シーケンスも20刻みで定義されているので矛盾しない)
  • しかし一度アプリが終了すると、キャッシュしていた分だけ番号が飛ぶ事になる

Delete Objects

ソースコード:

SelectQuery s1 = new SelectQuery(Log.class);
List l1 = ctx.performQuery(s1);
//この時点では、l1はstate:commited
ctx.deleteObjects(l1);
//この時点では、l1はstare:deleted 
ctx.commitChanges();
//ここでトランザクション開始。DELETE文が実行される
//DELETE後はl1はstate:transientになる

実行されたSQL:

INFO  QueryLogger: DELETE FROM APP.LOG WHERE LOGID = ?
INFO  QueryLogger: [bind: 603]
INFO  QueryLogger: === updated 1 row.
INFO  QueryLogger: [bind: 600]
INFO  QueryLogger: === updated 1 row.
INFO  QueryLogger: [bind: 602]
INFO  QueryLogger: === updated 1 row.
INFO  QueryLogger: [bind: 601]
INFO  QueryLogger: === updated 1 row.
INFO  QueryLogger: +++ transaction committed.

メモ:
  • deleteObjects()に複数のObjectが入ったlistを渡すと、各Object毎にDELETEを実行した後にCOMMITする。一括でDELETEするわけではない
  • deleteObjects()に空のlistを与えても、commitChanges()でエラーは出ない。単に何も実行されないだけ





| 新しいページ | 編集 | 差分 | 編集履歴 | ページ名変更 | アップロード | 検索 | ページ一覧 | タグ | RSS | ご利用ガイド | 管理者に問合せ |
@wiki - 無料レンタルウィキサービス | プライバシーポリシー | リンク元 | トラックバック