15

jOOQ 是否结合 PostgreSQL 提供对 JSR310 的支持?特别是,我正在尝试使用以下类:

  • java.time.Instant
  • java.time.LocalDate
  • java.time.LocalTime
  • java.time.LocalDateTime

我存储在以下数据类型中(根据http://www.postgresql.org/docs/9.1/static/datatype-datetime.html):

  • java.time.Instanttimestamp with timezone
  • java.time.LocalDatedate
  • java.time.LocalTimetime without timezone
  • java.time.LocalDateTimetimestamp without timezone

这些数据类型是否正确?

jOOQ 是否支持上述四个类(双向)之间java.sql.Timestamp的转换?java.sql.Datejava.sql.Time

4

2 回答 2

16

jOOQ 路线图

直到 jOOQ 3.6,官方还没有对 JSR-310 日期时间类型的支持,因为 jOOQ 开源版和商业版仍然支持 Java 6。

在 jOOQ 3.7 中,此更改为 Java 6 仅在专门构建的商业发行版中受支持,而标准发行版将需要 Java 8。此更改的相关问题是#4338

另一个更改涉及一个标志<javaTimeTypes/>,告诉源代码生成器生成 JSR-310 类型而不是java.sql.Date类似类型。默认情况下,此标志设置为 false,因此您需要将其设置为 true,直到问题#5714得到解决。

使用 jOOQ 3.6 或更低版本的 JSR-310 类型

同时,您可以自己绑定所需的类型,并让代码生成器使用您的自定义ConverterBinding. 请参阅手册中的相关章节:

正确的映射

JDBC 4.2 规范定义了哪些 JSR-310 数据类型应该映射到哪些 JDBC 数据类型(这与 PostgreSQL 的理解一致)。特别是,JDBC 规范列出了:

  • 添加了对映射java.time.LocalDate到 JDBC的支持DATE
  • 添加了对映射java.time.LocalTime到 JDBC 的支持TIME
  • 添加了对映射java.time.LocalDateTime到 JDBC的支持TIMESTAMP
  • 添加了对映射java.time.OffsetTime到 JDBC的支持TIME_WITH_TIMEZONE
  • 添加了对映射java.time.OffsetDateTime到 JDBC的支持TIMESTAMP_WITH_TIMEZONE

但是,JDBC 的理解似乎并不完全正确,因为很少有数据库真正将时区信息存储在TIMESTAMP WITH TIME ZONE数据类型中(例如 Oracle 会),另请参阅此 DBA/StackExchange 答案:https ://dba.stackexchange.com/a/59021/ 2512 . 由于不存储时区,因此映射java.time.Instant到的TIMESTAMP WITH TIME ZONE方法更好,因为 SQL 类型实际上只是一个 UTC 时间戳。

话虽如此,OffsetDateTime仍然可以映射到TIMESTAMP WITH TIME ZONE,但是您将不知道时间戳存储在 PostgreSQL 中时使用的时区。

于 2015-07-31T14:59:25.447 回答
6

jOOQ 3.9.0 现在可以在代码中配置 JSR-310 支持:

new Configuration()
     .withGenerator(new Generator()
          .withGenerate(new Generate()
              .withJavaTimeTypes(true)));

相同的结构将适用于 xml 配置(配置 - 生成器 - 生成 - javaTimeTypes)

密切关注https://github.com/jOOQ/jOOQ/issues/5714以查看默认情况下何时启用。

于 2017-01-03T10:46:12.840 回答