2014-09-27 16 views
2

我有一個簡單的方法(與jooq)時,基本上是這樣做的:jOOQ試圖爲標識列寫值寫記錄

MyObject myObject = ...; 
MyObjectRecord myObjectRecord = MyConvertor.convertor(myObject); 

DSLContext create = ...; 
create.insertInto(Tables.MY_OBJECT) 
     .set(MyObjectRecord) 
     .execute(); 

在表「MY_OBJECT」,我有一個字段「ID」 ,其定義爲:

id SERIAL NOT NULL; 

每當我運行上述代碼中,我得到的錯誤:

Exception in thread "main" org.jooq.exception.DataAccessException: SQL [insert into "public"."myobject" ("somefield", "id") values (?, ?)]; 
ERROR: null value in column "id" violates not-null constraint 
Failing row contains (somevalue, null). 

的問題,因爲我本身這就是說,jOOq正試圖爲身份列寫入一個值。 MyConvertor將它保留爲空的原因是因爲該值將由db生成。如何讓jooq不嘗試寫null到這個領域?

+0

您使用的是哪種版本的jOOQ?你是否明確地將'myObjectRecord'上的'id'值設置爲'null'?即是myObjectRecord.changed(MY_OBJECT.ID)== true'?這意味着你在插入時打算將'id'的值設爲'null'... – 2014-10-01 22:41:06

回答

0

而不是通過set傳遞整個對象,我想你想要做的是明確定義你想要的列和值,因爲你只想要insert他們的子集。

例如:

create.insertInto(Tables.MY_OBJECT, "somefield") 
     .values(MyObjectRecord.getSomeField()).execute(); 

假設MyObjectRecord具有getSomeField方法,該方法檢索該字段的值。

insertInto的第一個參數是表名,後跟可變列名稱列表。 values然後獲取列值的可變列表。這允許您指定特定的列/值對,它們是整個對象的子集。

您可能還可以使用set風格相反,但枚舉列/值對作爲參數代替,即:

create.insertInto(Tables.MY_OBJECT) 
     .set("somefield", MyObjectRecord.getSomeField()) 
     .execute(); 

:未經檢驗的,但我覺得上面一個(或兩者)應該工作。響應

編輯從OP評論:

OK ......如何使用版本的對象,它不包含id列在所有的,所以它不會被使用jOOQ?你也許可以有一個沒有id列的基礎對象,然後有一個派生的對象,當你需要的時候在頂部添加id列。

+0

是的,這是事實,但這是我不想做的事情。讓用戶這樣做幾乎使得大量的jooq API無法用於任何具有IDENTITY列的表。有一個類似的表,我正在做一個批處理插入,這也將變得無用,我將不得不在整個循環中迭代。 – 2014-09-27 19:21:29