Sop*_*ves 15 java sql jooq jsr310
jOOQ是否支持JSR310与PostgreSQL结合使用?特别是,我试图使用以下类:
java.time.Instantjava.time.LocalDatejava.time.LocalTimejava.time.LocalDateTime我存储在以下数据类型中(根据http://www.postgresql.org/docs/9.1/static/datatype-datetime.html):
java.time.Instant: timestamp with timezonejava.time.LocalDate: datejava.time.LocalTime: time without timezonejava.time.LocalDateTime: timestamp without timezone这些数据类型是否正确?
是否jOOQ支持转换之间java.sql.Timestamp,java.sql.Date以及java.sql.Time和四大类以上(双向)?
Luk*_*der 16
直到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得到解决.
在此期间,您可以自己绑定所需的类型,并让代码生成器使用您的自定义Converter或Binding.请参阅手册中的相关章节:
的JDBC 4.2规范定义了JSR-310中的数据类型应该被映射到JDBC数据类型(其具有相同的PostgreSQL的理解一致).特别是,JDBC规范列出:
java.time.LocalDate到JDBC的支持DATE.java.time.LocalTime到JDBC的支持TIMEjava.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中时使用了什么时区.
现在可以在jOOQ 3.9.0中使用JSR-310支持来配置代码:
new Configuration()
.withGenerator(new Generator()
.withGenerate(new Generate()
.withJavaTimeTypes(true)));
Run Code Online (Sandbox Code Playgroud)
相同的结构将适用于xml配置(配置 - 生成器 - 生成 - javaTimeTypes)
请关注https://github.com/jOOQ/jOOQ/issues/5714以查看默认情况下何时启用此功能.