jOOQ - 支持JSR310

时间:2015-07-31 14:14:57

标签: java sql jooq jsr310

jOOQ是否支持JSR310与PostgreSQL结合使用?特别是,我试图使用以下类:

  • 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.Timestampjava.sql.Datejava.sql.Time以及上述四个类别(两个方向)之间的翻译?

2 个答案:

答案 0 :(得分: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 spec定义了哪些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答案:{{ 3}}。由于未存储时区,因此将java.time.Instant映射到TIMESTAMP WITH TIME ZONE的方法更好,因为SQL类型实际上只是一个UTC时间戳。

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

答案 1 :(得分: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以查看默认情况下何时启用此功能。