ここで何が起こっているのかを理解するために、質問の下のコメントを見てください...基本的に、新しいDatabaseTypeが必要です(MariaDBを使用している場合は、明らかにMySQLをサブクラス化するだけです)。
public class MariaDBType extends MysqlDatabaseType {
private final static String DATABASE_URL_PORTION = "mysql";
private final static String DRIVER_CLASS_NAME = "org.mariadb.jdbc.Driver";
private final static String DATABASE_NAME = "MariaDB";
@Override
public boolean isDatabaseUrlThisType(String url, String dbTypePart) {
return DATABASE_URL_PORTION.equals(dbTypePart);
}
@Override
protected String getDriverClassName() {
return DRIVER_CLASS_NAME;
}
@Override
public String getDatabaseName() {
return DATABASE_NAME;
}
@Override
protected void appendDateType(StringBuilder sb, FieldType fieldType, int fieldWidth) {
/**
* TIMESTAMP in MySQL does some funky stuff with the last-modification time. Values are 'not null' by default
* with an automatic default of CURRENT_TIMESTAMP. Strange design decision.
*/
if (isDatetimeFieldWidthSupported()) {
sb.append("DATETIME(").append(fieldWidth).append(")");
} else {
sb.append("DATETIME");
}
}
public boolean isDatetimeFieldWidthSupported() {
return true;
}
}
これで、通常のように日付dataTypeを使用して、ミリ秒またはマイクロ秒の精度を取得できます...私の場合、幅にグレイの既存の注釈パラメーターを使用しました(このような場合、マイクロ秒ではなくミリ秒の精度のみが必要です)。
@DatabaseField(columnName = Constants.TIMESTAMP, dataType = DataType.DATE, width = 3)
private Date timestamp;
最後に、この特定の問題を解決しようとしている場合は、小数秒フラグを忘れないでください。
private static JdbcPooledConnectionSource cSource = new JdbcPooledConnectionSource();
cSource.setDatabaseType(new MariaDBType());
cSource.setUrl("jdbc:mysql://localhost:3306/database?useFractionalSeconds=true");
cSource.setUsername("username");
cSource.setPassword("password");