现在似乎没有办法实现这一点,除非使用@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