11

を使用して JodaTimeDateTimeフィールドをtimestamptz列に格納していorg.jadira.usertype:usertype.jodatime:1.9ます。アプリ サーバーには +4 タイム ゾーンがあります。DB サーバー +9 タイムゾーン。+9 はタイムゾーンです (正しい値は ですnew DateTime()) 。 ${currentTime+1hour}+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

同じ問題がありました。config で 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

Ok。私は問題を解決するために 8 時間を費やしました。usertypeプロジェクトを使用してJodaTime を保持している場合は、クラスdatabaseZoneのプロパティPersistentDateTimeを現在のアプリケーション サーバーのタイムゾーン (データベースではありません!) に設定する必要があります。

ただし、公式の休止状態サポートを使用することをお勧めします。java.utl.Date永続化を使用し、デフォルトDateTimejava.util.Date正しく永続化されるため、すぐに問題を解決します

于 2012-04-12T07:43:14.343 に答える
1

-Duser.timezone=UTC to JAVA_OPTS を使用して JVM を起動してみてください。その場合、時間は 1 つのゾーン内にあり、それに対して操作を実行して、現在地に変換することができます。

于 2012-04-11T03:50:41.210 に答える
0

ヒョードル、

Oracle TIMESTAMP WITH TIME ZONE列を使用していると思いますか?プロジェクトはパッチを受け入れて喜んでいますが、データベース間でJDBCの処理が異なるため、Usertypeはまだこのタイプをサポートしていません(つまり、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 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);
}
}
于 2013-01-23T09:35:39.883 に答える