2013-02-19 185 views
1

ORMLite問題。我有一組POJO,Android應用程序和Java Web服務都使用這些POJO來持久化數據(分別爲SQLite和MariaDB)。從5.3開始,我相信,MariaDB支持時間戳/日期時間的長度,將字段的精度擴展到微秒(MySQL本身在新的開發5.6版本中支持這一點)。ORMLite在MySQL/MariaDB中以毫秒級精度的日期

但是,即使我手動修改命令行中的字段以將列設置爲DATETIME(6),我仍無法使ORMLite以毫秒級的精度持續保存我的Date字段。我知道我可以在POJO中使用DATE_LONG或DATE_STRING的數據類型,但是我想在MariaDB中使用實際的DATETIME類型。

有什麼辦法可以以毫秒級的精度做到這一點?

+0

所以這是與MySQL驅動程序?你可能需要添加一個自定義數據類型:http://ormlite.com/docs/custom-data-types – Gray 2013-02-19 00:36:10

+0

啊,你的問題讓我意識到了這個問題。 MariaDB現在實際上擁有自己的JDBC Java客戶端(他們奇怪地建議您仍然將連接URI格式化爲jdbc:mysql://)。由於DatabaseTypeUtils的構造方式,我無法爲MariaDB驅動程序添加BaseDatabaseType子類...所以我被卡住了使用MySQL連接器。如果用戶可以創建他們自己的BaseDatabaseType子類,並且在DatabaseTypeUtils上有一個靜態setter來加載它(授予,我承認你已經覆蓋了所有主要DB),但MariaDB只會更受歡迎)! – 2013-02-19 03:46:32

+0

好吧,我顯然很愚蠢......當你啓動一個新的JdbcConnectionSource/JdbcPooledConnectionSource時,你支持傳入一個databaseType。所以我簡單地將MysqlDatabaseType分類並做了我需要做的事情。我將下面的代碼。另外,對於可能實際上試圖解決此問題的任何用戶,您需要在JDBC連接字符串中設置useFractionalSeconds標誌。灰色 - 感謝回覆如此迅速。 – 2013-02-19 04:37:30

回答

1

看一看一個問題下的意見,瞭解這裏發生了什麼......基本上你需要一個新的數據庫類型(如果與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; 
    } 
} 

現在我可以像普通一樣使用日期數據類型,並獲得毫秒或微秒精度...在我的情況下,我使用了格雷現有的註釋參數寬度(適用於這種情況,我只需要毫秒精度,而不是微秒)。

@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"); 
+0

這是一個很好的答案馬特。做得好。爲其他人提供所需的所有信息,以完成您所做的工作。 – Gray 2013-02-19 13:54:38