Problemas de ORMLite en MySQL creando Marcas de tiempo
timestamp (1)
En este momento, no parece haber una manera de lograr esto, excepto usar @DatabaseFiled(version = true)
que no funciona para los campos de Timestamp
de Timestamp
. Esto se ha solucionado en el tronco y estará trabajando en 4.46:
Para que funcione con los campos Timestamp en 4.45 es bonito cada uno. Tendrá que extends TimeStampType
y anular el siguiente método. Vea la parte inferior de esta respuesta para más detalles:
@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);
}
}
Luego, especifique su campo como:
@DatabaseField(persisterClass = LocalCurrentTimeStampType.class, version = true)
java.sql.Timestamp timestamp;
[[Lo siguiente funciona para la fecha de creación pero no para otras actualizaciones. Lo dejaré para información general.]]
Esto no fue trivial, pero finalmente descubrí la forma en que puede hacerlo utilizando la última versión de trunk. En 4.46 @DatabaseField(readOnly = true)
soporte para @DatabaseField(readOnly = true)
para campos que solo son de solo lectura. Esto te permite decir:
@DatabaseField(defaultValue = "CURRENT_TIMESTAMP()", readOnly = true)
java.sql.Timestamp timestamp;
Los campos de solo lectura nunca se crean ni se actualizan, solo se devuelven en las consultas. El problema es que TimeStampType
arroja una excepción cuando intenta validar el CURRENT_TIMESTAMP()
. Para resolver esto, necesita definir una persistencia personalizada:
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);
}
}
}
Entonces su definición de campo se convierte en:
@DatabaseField(persisterClass = LocalCurrentTimeStampType.class,
defaultValue = "CURRENT_TIMESTAMP()", readOnly = true)
java.sql.Timestamp timestamp;
Puede obtener la última versión del código github: https://github.com/j256/ormlite-core
Tengo problemas para crear marcas de tiempo con MySql. Siguió las sugerencias aquí en términos de no utilizar una entrada DataType.TIME_STAMP
específica en la definición @DatabaseField
.
Mi actual @DatabaseField
ve así:
@DatabaseField(format="yyyy-MM-dd HH:mm:ss", defaultValue="CURRENT_TIMESTAMP")
private Timestamp updatedAt;
Aún obteniendo errores en Table create:
Unable to create table because of [Problems parsing default date
string ''CURRENT_TIMESTAMP'' using ''yyyy-MM-dd HH:mm:ss.SSSSSS'']
Parece que se está ignorando la definición de formato, sin la definición de formato, sigo teniendo este error:
Unable to create table because of [Problems parsing default date
string ''CURRENT_TIMESTAMP'' using ''yyyy-MM-dd HH:mm:ss.SSSSSS'']
He intentado especificar el tipo de datos, cambiándolo a DATE_TIME
, etc. Aún no he encontrado una combinación (aparte de no usar Timestamp en absoluto y solo crear un DATE_TIME
, que funciona, pero no con CURRENT_TIMESTAMP
).
Estoy realmente atascado, dado que actualicé manualmente las tablas en el pasado, pero ahora el número está creciendo y me gustaría que los procesos se automaticen por completo usando las opciones de Crear tabla en ORMLite, sin tener que meterse manualmente con el esquema más tarde.
Cualquier sugerencia sería muy bienvenida sobre cómo hacer que esto funcione.