4

MySql でタイムスタンプを作成する際に問題があります。定義で特定のエントリを使用しないという点で、ここの提案に従いました。DataType.TIME_STAMP@DatabaseField

私の現在@DatabaseFieldは次のようになります。

 @DatabaseField(format="yyyy-MM-dd HH:mm:ss", defaultValue="CURRENT_TIMESTAMP")
 private Timestamp updatedAt;

テーブルの作成でまだエラーが発生しています:

Unable to create table because of [Problems parsing default date
string 'CURRENT_TIMESTAMP' using 'yyyy-MM-dd HH:mm:ss.SSSSSS']

したがって、フォーマット定義がなくても、フォーマット定義を無視しているように見えますが、それでもこのエラーが発生します。

Unable to create table because of [Problems parsing default date
string 'CURRENT_TIMESTAMP' using 'yyyy-MM-dd HH:mm:ss.SSSSSS']

dataType を指定したり、 に変更したりしてDATE_TIMEみましたが、まだ組み合わせが見つかりませんでした (Timestamp をまったく使用せずに を作成する以外は、動作しますが、DATE_TIMEでは動作しませんCURRENT_TIMESTAMP)。

過去に手動でテーブルを更新したことがあるので、本当に行き詰まっていますが、今ではその数が増えており、ORMLite の [テーブルの作成] オプションを使用してプロセスを完全に自動化したいと考えています。スキーマは後で。

これを機能させる方法についての指針は大歓迎です。

4

1 に答える 1

3

現時点では、フィールド@DatabaseFiled(version = true)では機能しないを使用する以外に、これを達成する方法はないようです。Timestampこれはトランクで修正されており、4.46 で動作する予定です:

http://ormlite.com/docs/version-field

ただし、4.45 でタイムスタンプ フィールドを使用できるようにするのはかなりの方法です。extends TimeStampType次のメソッドをオーバーライドする必要があります。詳細については、この回答の下部を参照してください。

@Override
public Object moveToNextValue(Object currentValue) {
    long newVal = System.currentTimeMillis();
    if (currentValue == null) {
        return new java.sql.Timestamp(newVal);
    } else if (newVal == ((java.sql.Timestamp) currentValue).getTime()) {
        return new java.sql.Timestamp(newVal + 1L);
    } else {
        return new java.sql.Timestamp(newVal);
    }
}

次に、フィールドを次のように指定します。

@DatabaseField(persisterClass = LocalCurrentTimeStampType.class, version = true)
java.sql.Timestamp timestamp;

[[以下は作成日では機能しますが、他の更新では機能しません。一般的な情報として残しておきます。]]

これは自明ではありませんでしたが、トランクの最新バージョンを使用してこれを行う方法を最終的に見つけました。4.46 では、@DatabaseField(readOnly = true)読み取り専用のフィールドのサポートを追加します。これにより、次のことが言えます。

@DatabaseField(defaultValue = "CURRENT_TIMESTAMP()", readOnly = true)
java.sql.Timestamp timestamp;

読み取り専用フィールドが作成または更新されることはなく、クエリでのみ返されます。問題は、 がTimeStampTypeを検証しようとすると例外がスローされることCURRENT_TIMESTAMP()です。これを解決するには、カスタムの永続化を定義する必要があります。

public class LocalCurrentTimeStampType extends TimeStampType {
    private static final LocalCurrentTimeStampType singleton =
        new LocalCurrentTimeStampType();
    private String defaultStr;
    public LocalCurrentTimeStampType() {
        super(SqlType.DATE, new Class<?>[] { java.sql.Timestamp.class });
    }
    public static LocalCurrentTimeStampType getSingleton() {
        return singleton;
    }
    @Override
    public boolean isEscapedDefaultValue() {
        if ("CURRENT_TIMESTAMP()".equals(defaultStr)) {
            return false;
        } else {
            return super.isEscapedDefaultValue();
        }
    }
    @Override
    public Object parseDefaultString(FieldType fieldType, String defaultStr) throws SQLException {
        this.defaultStr = defaultStr;
        if ("CURRENT_TIMESTAMP()".equals(defaultStr)) {
            return defaultStr;
        } else {
            return super.parseDefaultString(fieldType, defaultStr);
        }
    }
}

次に、フィールド定義は次のようになります。

@DatabaseField(persisterClass = LocalCurrentTimeStampType.class,
    defaultValue = "CURRENT_TIMESTAMP()", readOnly = true)
java.sql.Timestamp timestamp;

github コードから最新バージョンを取得できます: https://github.com/j256/ormlite-core

于 2013-04-04T18:38:16.360 に答える