mysql timestamp ormlite

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:

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

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.