2009-09-01 70 views
3

在過去的幾個小時裏,我一直在調試這個問題,但沒有成功,我想我會把它拋出去看看它在哪裏。使用Hibernate將java.util.Date持久化到MySql中的問題

我正在開發一個Java程序,它使用Hibernate和DAO/DTO模式將數據保存到MySql數據庫中。在我的數據庫中,我有一個memberprofile表和firstLoginDate列。在數據庫中,該列的SQL類型是DateTime。 Hibernate的XML文件的相應部分是

<property name="firstLoginDate" type="timestamp"> 
    <column name="firstLoginDate" sql-type="DATETIME"/> 
</property> 

然而,當我嘗試將Date保存到該表(在Java中),「約會」(年/月/日),部分是正確的堅持,但「時間」部分(小時:分鐘:秒)不是。例如,如果我試圖保存代表2009-09-01 14:02:23的Java日期,那麼數據庫中的結果是2009-09-01 00:00:00

我已經確認我自己的代碼不是踩踏時間組件;就我所見到的源代碼而言(調試時)時間組件保持正確。但是,在提交更改之後,我可以使用MySql查詢瀏覽器檢查相關行(或者只是從我的Java代碼中從數據庫中取出),並且確實缺少時間組件。有任何想法嗎?

我確實嘗試了堅持java.sql.Timestamp而不是java.util.Date,但問題依然存在。另外,我在另一個表格中有一個非常類似的列,根本沒有表現出這種行爲。

我希望你們會有問題,所以我會根據需要進行編輯。謝謝!


編輯@Nate:

... 
MemberProfile mp = ... 
Date now = new Date(); 
mp.setFirstLoginDate(now); 
... 

MemberProfile是相當多的DTO的包裝類;設置第一個登錄日期將設置DTO的一個字段,然後提交更改。


編輯2:這似乎是我的機器上纔會發生。我已經嘗試過重建表模式並清除所有本地源代碼並從CVS重新檢出,但沒有任何改進。現在我真的很難過。


編輯3:完全擦我的MySQL安裝,重新安裝,並從已知良好的副本還原數據庫也沒有解決問題。

+0

您如何在Java代碼中設置firstLoginDate值? – Nate 2009-09-01 20:36:43

回答

1

我有一個類似的設置給你(除防雷工程),和我的映射文件看起來像這樣:

<property name="firstLoginDate" type="timestamp"> 
    <column name="firstLoginDate" length="19"/> 
</property> 

我的數據庫顯示的列定義日期時間。

編輯:

一些更多的東西來檢查......

  • 檢查MySQL驅動程序在本地作爲工作機相同 。
  • 嘗試刪除表格,並讓 hibernate爲您重新創建它。如果 有效,那麼在映射中存在 問題。
0

這可能也可能不是您的問題,但我們遇到了嚴重的日期/時間信息問題 - 如果您的數據庫服務器與提交數據的計算機位於不同的時區,則可能存在不一致的數據保存。

除此之外,我們標註的配置,它看起來像下面這樣:

@Column(name="COLUMN_NAME", length=11) 
0

如果它是可行的你,可以考慮使用JodaTime DateTime類比內置的類和你更漂亮

@ org.hibernate.annotations.Type(:也可以使用Hibernate與他們休眠支持

使用他們,我記住我的字段或獲取方法具有註釋定製Hibernate的類型,他們堅持鍵入= 「org.joda.time.contrib.hibernate.PersistentDateTime」) @Column(name = 「日期」)

這工作得很好,我和它也產生正確的架構生成SQL

這工作正常在MySQL中

-1

在Temporal annonation旁邊使用TemporalType.TIMESTAMP。

請檢查下面的例子。

@Temporal(TemporalType.TIMESTAMP) 
public Date getCreated() { 
    return this.created; 
} 
+0

OP使用XML映射文件。 – 2010-10-02 18:06:01