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");
>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.
>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()でエラーは出ない。単に何も実行されないだけ@wikiへ