11

我通过使用将 JodaTimeDateTime字段存储到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?

4

7 回答 7

10

只需设置 JPA 属性:

<property name="jadira.usertype.autoRegisterUserTypes"
          value="true"/>
<property name="jadira.usertype.databaseZone"
          value="jvm"/>
<property name="jadira.usertype.javaZone"
          value="jvm"/>
于 2013-05-26T15:33:50.980 回答
8

我遇到过同样的问题。在配置中指定 app 和 db 区域解决了这个问题。

            <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>
于 2013-03-13T22:48:33.130 回答
6

行。我花了8个小时来解决这个问题。如果您使用用户类型项目来持久化 JodaTime,则必须将类的属性设置databaseZone等于PersistentDateTime当前应用程序服务器时区(而不是数据库!)。

但是最好使用官方的hibernate支持。它解决了开箱即用的问题,因为它默认使用java.utl.Date持久化DateTime和正确持久化java.util.Date

于 2012-04-12T07:43:14.343 回答
1

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

于 2012-04-11T03:50:41.210 回答
0

费多尔,

我是否正确假设您使用的是 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/

于 2012-04-15T07:11:55.163 回答
0

我通过创建其他 PersistentDateTime 扩展 AbstractVersionableUserType 解决了这个问题。

import java.sql.Timestamp;

import org.hibernate.SessionFactory;
import org.hibernate.usertype.ParameterizedType;
import org.jadira.usertype.dateandtime.joda.columnmapper.TimestampColumnDateTimeMapper;
import org.jadira.usertype.spi.shared.AbstractVersionableUserType;
import org.jadira.usertype.spi.shared.IntegratorConfiguredType;
import org.joda.time.DateTime;

public class PersistentDateTime extends AbstractVersionableUserType<DateTime, Timestamp, TimestampColumnDateTimeMapper> implements ParameterizedType, IntegratorConfiguredType {

@Override
public int compare(Object o1, Object o2) {
    return ((DateTime) o1).compareTo((DateTime) o2);
}

@Override
public void applyConfiguration(SessionFactory sessionFactory) {

    super.applyConfiguration(sessionFactory);

    TimestampColumnDateTimeMapper columnMapper = (TimestampColumnDateTimeMapper) getColumnMapper();
    columnMapper.setDatabaseZone(null);
    columnMapper.setJavaZone(null);
}
}
于 2013-01-23T09:35:39.883 回答
0

只是 Spring Boot 用户的更新。我能够做到以下几点:

spring.jpa.properties.jadira.usertype:
  autoRegisterUserTypes: true
  databaseZone: jvm
  javaZone: jvm

我把这个放在我的application.yaml文件里。

于 2020-01-24T17:36:41.010 回答