我有一个简单的方法(使用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将其保留为null的原因是,该值将由db生成。如何使jooq不尝试向该字段写入null?
我认为您要做的不是通过set传递整个对象,而是显式定义要插入的列和值,因为您只想插入其中的一个子集。
例如:
create.insertInto(Tables.MY_OBJECT, "somefield")
.values(MyObjectRecord.getSomeField()).execute();
假设MyObjectRecord有一个getSomeField方法,该方法检索该字段的值。
insertInto的第一个参数是表名,后面是列名的vararg列表<代码>值然后获取列值的vararg列表。这允许您指定特定的列/值对,这些列/值对是整个对象的子集。
您也可以使用set样式,但可以将列/值对枚举为参数,即:
create.insertInto(Tables.MY_OBJECT)
.set("somefield", MyObjectRecord.getSomeField())
.execute();
注意:未经测试,但我认为上述之一(或两者)应该有效。
编辑以响应OP的评论:
好的……使用一个不包含id列的对象版本怎么样,这样jOOQ就不会使用它了?您可能有一个没有id列的基本对象,然后有一个派生对象,在需要时在顶部添加id列。
在我的postgresql数据库的一个表中,有2列具有默认值。 我在jOOQ生成器配置中为其中一个定义了一个转换器。 当我执行函数record.store()时,默认值很好地用于没有转换器的字段,但不用于另一个变为null的字段。 我从来没有明确设置这些字段,但我猜record.changed(MY_OBJECT. FIELD)==true后执行的转换器。 我不确定这是否是预期的行为。是虫子吗?有
目前我正在从pojos列表映射到记录,我希望能够一次插入多行。我如何在JOOQ中用一个事务做到这一点? 我曾尝试将列表放入“值”中,但出现异常“值的数量必须与字段的数量匹配”
如何将NDEF消息写入NFC标记?我必须更改清单文件吗?到目前为止,我有生成NDEF消息的代码: 如何发现标签?有人能帮我吗?
我在Java中编写了一个更新由制表符分隔的文本文件的方法。我正在使用opencsv库。首先我在现有文件中读取,然后我更改一些列的值,然后我覆盖文件。我正在运行Windows 7。现在的问题是,并非所有内容都写入文件。即使我不更改任何值,只是覆盖文件,也不是所有记录都写入。 我的代码如下。它有什么问题?
问题内容: 由于某种原因,每次尝试使用Tomcat上的java webapp写入计算机上的文件夹时,我都会不断获取信息。此文件夹的权限设置为对我的计算机(Windows)上的每个人都完全控制。有人知道我为什么会得到这个例外吗? 这是我的代码: 这是错误: 异常:java.nio.file.AccessDeniedException:C:\ safesite_documents \ site1 ja
我收到以下异常- org.hibernate.exception.sqlgrammarexception:无法插入:[Employee] 以下是详细信息: hibernate.cfg.xml employee.hbm.xml 请帮助解决异常。提前道谢!