JOOQ时间戳字段的默认值与db默认值不同

时间:2018-11-29 21:00:29

标签: postgresql jooq

我有一个具有下表的PostgreSQL数据库

CREATE TABLE IF NOT EXISTS user_acc
(
  name          TEXT                  NOT NULL,
  updated       TIMESTAMP             DEFAULT now()
);

然后,在使用JOOQ时,数据插入如下(科特林语言

val record = create.newRecord(USER_ACC)
record.name = "username"
record.store()

然后将记录正确插入到数据库中,默认时间戳记值来自now()。

------------------------------------------
| user      | updated                    |
------------------------------------------
|username   |2018-11-29 14:14:52.635838  |
------------------------------------------

问题是,执行以上JOOQ语句的过程与数据库所在的服务器不在同一服务器上。而且两者都在不同的时区。

因此,如果我直接通过连接到数据库插入一条记录,则默认时间戳(从now()开始)与JOOQ插入的时间戳相隔数小时。

我相信这是因为,在JOOQ的自动生成的类中, updated 字段的生成方式为

 /**
 * The column <code>user_acc.updated</code>.
 */
 public final TableField<UserAccRecord, LocalDateTime> UPDATED = createField("updated", org.jooq.impl.SQLDataType.LOCALDATETIME.defaultValue(org.jooq.impl.DSL.field("now()", org.jooq.impl.SQLDataType.LOCALDATETIME)), this, "");

这是否在服务端生成当前时间戳(for now()),而不是数据库生成默认时间戳?如果是这样,我如何让JOOQ跳过此步骤,并使用数据库的now()值?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

这实际上不是jOOQ的问题-如果您以描述的方式插入记录,那么jOOQ不会使用该时间戳做任何事情。它是由数据库生成的,然后有可能取回给客户端。但是请注意,它属于TIMESTAMP WITHOUT TIME ZONE数据类型,在您读取此值的任何时区中,其值均为2018-11-29 14:14:52.635838。因此,不同的纪元值取决于客户端。这不一定有用-防止这种情况的最佳方法是改用TIMESTAMP WITH TIME ZONE数据类型,在PostgreSQL中这只是一个简单的UTC时间戳。