Joda时间DateTime错误地存储在数据库中

问题描述 投票:11回答:7

我正在使用DateTime将JodaTime timestamptz字段存储到org.jadira.usertype:usertype.jodatime:1.9列。应用服务器的时区为+4。数据库服务器+9时区。 new DateTime()产生${currentTime+1hour}+9,其中+9是时区(正确值为${currentTime+5hours)+9)。

我尚未找到任何相关主题。 java.util.Date正确存储。

域对象具有以下映射属性:

static mapping = {
    dateCreated sqlType:'timestamptz'
}

如何正确存储DateTime?

hibernate grails groovy gorm jodatime
7个回答
9
投票

只需设置JPA属性:

<property name="jadira.usertype.autoRegisterUserTypes"
          value="true"/>
<property name="jadira.usertype.databaseZone"
          value="jvm"/>
<property name="jadira.usertype.javaZone"
          value="jvm"/>

8
投票

我有同样的问题。在配置中指定应用程序和数据库区域可解决此问题。

            <prop key="jadira.usertype.autoRegisterUserTypes">true</prop>
            <prop key="jadira.usertype.databaseZone">America/Los_Angeles</prop>
            <prop key="jadira.usertype.javaZone">America/Los_Angeles</prop>

4
投票

好我已经花了8个小时来解决问题。如果您正在使用usertype项目保留JodaTime,则必须将databaseZone类的PersistentDateTime属性设置为等于当前应用程序服务器时区(不是数据库!)。

但是最好使用official hibernate support。它解决了现成的问题,因为它使用java.utl.Date持久保存DateTime,并且默认情况下正确使用java.util.Date持久保存


1
投票

尝试使用-Duser.timezone = UTC将JVM启动到JAVA_OPTS,这样时间就在一个区域中,然后您可以对该区域进行操作以将其转换为您所处的位置。


0
投票

Fedor,

我是否正确地假设您正在使用Oracle TIMESTAMP WITH TIME ZONE列?尽管该项目很乐意接受补丁程序,但由于JDBC在数据库之间的处理有所不同,因此用户类型尚不支持此类型(例如,使用TIME ZONE)。

这里有关于Oracle的一些很好的讨论:http://puretech.paawak.com/2010/11/02/how-to-handle-oracle-timestamp-with-timezone-from-java/


0
投票

我已经通过创建其他PersistentDateTime扩展AbstractVersionableUserType来解决此问题。


0
投票

仅是Spring Boot用户的更新。我能够执行以下操作:

© www.soinside.com 2019 - 2024. All rights reserved.