Joda time DateTime incorrectly stores in database

前端 未结 7 1652
青春惊慌失措
青春惊慌失措 2020-12-30 08:18

I\'m storing JodaTime DateTime field to timestamptz column by using org.jadira.usertype:usertype.jodatime:1.9. App server has +4 time

相关标签:
7条回答
  • 2020-12-30 08:54

    Ok. I have spend 8 hours to solve the problem. If your are using usertype project to persist JodaTime, you have to set databaseZone property of PersistentDateTime class equals to current application server timezone (not database!).

    But it's better to use official hibernate support. It solves the problem out of the box because it uses java.utl.Date to persist DateTime and java.util.Date correctly persisted by default

    0 讨论(0)
  • 2020-12-30 08:55

    Try starting JVM with -Duser.timezone=UTC to JAVA_OPTS that way the time is in one zone and you can then do your operations on that to convert it to where ever you are.

    0 讨论(0)
  • 2020-12-30 08:55

    I had resolved this problems by creating other PersistentDateTime extends 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);
    }
    }
    
    0 讨论(0)
  • 2020-12-30 09:11

    Just set JPA properties:

    <property name="jadira.usertype.autoRegisterUserTypes"
              value="true"/>
    <property name="jadira.usertype.databaseZone"
              value="jvm"/>
    <property name="jadira.usertype.javaZone"
              value="jvm"/>
    
    0 讨论(0)
  • 2020-12-30 09:17

    Just an update for Spring Boot users. I was able to do the following:

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

    I put this in my application.yaml file.

    0 讨论(0)
  • 2020-12-30 09:18

    Fedor,

    Am I right to assume you are using Oracle TIMESTAMP WITH TIME ZONE column? Usertype doesn't support this type yet (i.e. with TIME ZONE) due to the handling with JDBC differing between databases, although the project will be happy to accept patches.

    There's some good discussion wrt Oracle here: http://puretech.paawak.com/2010/11/02/how-to-handle-oracle-timestamp-with-timezone-from-java/

    0 讨论(0)
提交回复
热议问题