4

我在使用 MySql 创建时间戳时遇到问题。遵循此处的建议,不使用定义中的特定DataType.TIME_STAMP条目@DatabaseField

我现在的@DatabaseField样子是这样的:

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

仍然在 Table create 上出现错误:

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 中的 Create Table 选项完全自动化流程,而不必手动弄乱稍后的架构。

任何关于如何使其工作的指针都将受到欢迎。

4

1 回答 1

3

现在似乎没有办法实现这一点,除非使用@DatabaseFiled(version = true)which 不适用于Timestamp字段。这已在主干中得到纠正,并将在 4.46 中工作:

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

让它与 4.45 中的 Timestamp 字段一起工作是很不错的。您将需要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 回答