6

JOOQ はデータベース列のデフォルト値を完全に無視しているようです。ActiveRecord オブジェクトを更新することも、INSERT でこの列をスキップすることもありません。代わりに、NOT NULL 列で失敗する NULL に設定しようとします。

例:

CREATE TABLE bug (
  foo int,
  bar int not null default 42
);

  BugRecord b = jooq.newRecord(BUG);
  b.setFoo(3);
  b.store();          

  assertNotNull(b.getBar()); // fails

  Record r = jooq.select().from(BUG).fetchOne();
  assertEquals(new Integer(-1), r.getValue(BUG.BAR)); // fails

  // DataMapper pattern
  Bug b = new Bug();
  b.setFoo(3);
  bugDao.insert(b); // Fails because it tries to set "bar" to NULL

私が期待する動作は、newRecord() がすべてのデフォルト変数を korrekt 値で初期化することです (ただし、結果がカスタム関数の結果である場合、これが難しいことは理解しています :-)) または INSERT INTO が行うことです。変更されていないすべての列をデフォルト値で挿入するのではなく、INSERT INTO の後にデータベースから既存の値をフェッチする SELECT が続きます (RETURNING と同様)。

これは本当にバグ/制限ですか、それとも「デフォルトではない」列を使用できるようにする構成オプションなどがありませんか?

4

1 に答える 1

10

ここでいくつかのことを見つけました (すべて jOOQ 3.1 および以前のバージョンに関連しています)。

挿入からデフォルト値を返す:

BugRecord b = jooq.newRecord(BUG);
b.setFoo(3);
b.store();          

assertNotNull(b.getBar()); // fails

それは確かに、あると便利な機能です。現在、jOOQ は IDENTITY 列の値のみをフェッチします。INSERT .. RETURNING構文または構文を使用してUPDATE .. RETURNING、挿入または更新後に返される列を明示的に選択できます。しかし、通常の CRUD 操作でこれを行うことができれば、はるかに優れています。

これは、このスレッドでも言及されていました。これに関連する機能リクエストは#1859です。

を呼び出すことで、この問題を回避できます。

b.refresh();             // Refresh all columns
b.refresh(BUG.BAR, ...); // Refresh only some columns

NULL の挿入と DEFAULT の挿入UpdatableRecord:

Record r = jooq.select().from(BUG).fetchOne();
assertEquals(new Integer(-1), r.getValue(BUG.BAR)); // fails

私の意見では、これはバグです。jOOQ の CRUD 操作はDEFAULT値に対して安全でなければなりません。store()//操作の前に明示的に設定された値のみがinsert()update()生成された SQL でレンダリングされる必要があります。このために#2698を登録しました。

NULL の挿入と DEFAULT の挿入DAO:

// DataMapper pattern
Bug b = new Bug();
b.setFoo(3);
bugDao.insert(b); // Fails because it tries to set "bar" to NULL

ナイスキャッチ。POJO には列ごとに内部の「変更済み」/「ダーティ」フラグが付いていないため、これを解決/強化するのは簡単ではありません。nullしたがって、POJO 内の参照の意味を知ることはできません。

一方、jOOQ は、列が null 可能かどうかを既に認識しています。jOOQ が列の句の存在に関するメタデータも保持している場合、組み合わせが次の結果につながる必要がDEFAULTあると推測できます。NOT NULL DEFAULT

INSERT INTO bug(foo, bar)
VALUES(3, DEFAULT)

そして、

UPDATE bug SET bar = DEFAULT WHERE foo = 3

登録しました

  • #2699 : 生成されたコードにいくつかのメタデータ情報を追加する
  • #2700 : DAO からの SQL で上記のメタデータを活用する
于 2013-08-17T08:46:57.870 に答える