DTeam 技术日志

Doer、Delivery、Dream

Grails 3中使用java.time时间类型

冯宇 Posted at — Feb 18, 2018 阅读

java8在JSR 310提案中,引入了新的时间日期类型java.time.*,这个包下的类借鉴了joda-time的设计,是线程安全的,提供很多方便的格式化与转换的方案。总之,java8以后官方强烈推荐使用新的java.time.*替代老旧的java.util.Calendarjava.util.Date

但是对于Grails 3框架来说,由于需要最低支持java 7,因此对于java8的一些特性并非开箱即用,而且官方文档至今的domain范例中,依旧使用Date类型。

grails-java8 plugin

grails 官方有一个名为grails-java8的plugin,这个插件在官方文档并未提及,甚至插件本身没有任何文档。但是看插件的包名和测试代码,的确是测试JSR 310的支持,具体的插件效果可以参考测试代码

Domain中使用java.time

这个比较特殊,hibernate本身是支持java.time的(需hibernate5以上版本),在grails的domain中使用java.time类型,需要同时引入上述grails-java8 plugin和hibernate-java8两个依赖才可以。这样在Domain中就可以使用java.time类型了,JDBC这一层会自动转换为timestamp类型。具体的类型对照表参考hibernate的官方文档: https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#basic-provided

总结

在grails中使用java.time类型,在依赖中需要引入两个:

dependencies {
    compile 'org.grails.plugins:grails-java8:1.2.2'
    compile 'org.hibernate:hibernate-java8:5.2.13.Final'
}

就可以在grails3中使用java.time类型了。

如果想使用timestamptz类型的时间日期格式,如: OffsetDateTime,需要在mapping配置中指明sqlTypetimestamptz,如:

    OffsetDateTime dateCreated

    static mapping = {
        dateCreated comment: '创建时间', sqlType: 'timestamptz', index: 'idx_date_created'
    }

相关文章