2012-02-16 76 views
0

在我的實體類的一個日期字段定義如下錯誤日期:JPA和sqlite3的 -

@Temporal(TemporalType.TIMESTAMP) 
@Column(name = "LAST_EXECUTED") 
private Date lastExecuted = new Date(); 

然而,當它是通過JPA持久化到sqlite3的數據庫,該數據庫值始終是「1899年至1812年-30' 。你有什麼想法爲什麼?

在數據庫中,該字段被定義爲DATETIME

我試過使用SqliteJDBC和Xerial SQLite JDBC。

更新:中的EclipseLink JPA打開SQL調試,並關閉參數結合後,它看起來像日期插入如下:

insert into run (last_executed) values ('{ts ''2012-02-17 10:34:58.013''}'); 

,如果插入,手動SQLite中,給出了日期'1899-12-30'。

當然,任何解決方法將不勝感激。

+0

很明顯,您正在使用JPA的特定實現,並且每個JPA實現都會給出不同的結果。因此,實際上提及哪些JPA實施將是一種幫助;-) – DataNucleus 2012-02-17 08:20:35

+0

對不起;它是EclipseLink JPA。 – Dario 2012-02-17 09:37:46

+0

無法幫助您,因爲DataNucleus JPA會執行INSERT作爲「INSERT INTO A(LAST_EXECUTED)VALUES('2012-02-17 13:41:09.453')」,並且在檢索時存在持續存在的所有數據 – DataNucleus 2012-02-17 13:43:28

回答

1

日期看起來在插入正確,所以似乎是某種SQLite問題。您通常應該使用參數綁定,看起來SQLite確實允許綁定時間戳,或者忽略DATE部分。如果使用TemporalType.DATE會怎麼樣?

也許嘗試通過原始JDBC來查看您的JDBC驅動程序問題究竟是什麼?

對於打印的語法,如果不使用參數綁定,您可以通過創建您自己的DatabasePlatform子類來自定義它。您打印的語法是標準的JDBC時間戳語法。

0

您可以驗證它是java.util.Date而不是java.sql.Date嗎?

@Temporal(TemporalType.TIMESTAMP) 
@Column(name = "LAST_EXECUTED") 
private java.util.Date lastExecuted = new Date(); 

如果重新打開參數綁定,調試輸出的外觀如何?

0

使用smalldatetime解決問題~~~試試吧。