簡體   English   中英

使用Hibernate將java.util.Date持久化到MySql中的問題

[英]Problem persisting a java.util.Date into MySql using Hibernate

我在過去的幾個小時里一直在調試這個問題而沒有成功,並且認為我會把它扔到SO那里看看它到底發生了什么。

我正在開發一個Java程序,它使用Hibernate和DAO / DTO模式將數據保存到MySql數據庫中。 在我的數據庫中,我有一個帶有firstLoginDate列的memberprofile表。 在數據庫中,該列的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安裝,重新安裝它,並從已知的良好副本還原數據庫也無法解決問題。

我有類似的設置(除了我的工作),我的映射文件如下所示:

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

我的數據庫將列定義顯示為datetime。

編輯:

還有一些事要檢查......

  • 檢查本地和工作機器上的mysql驅動程序是否相同。
  • 嘗試刪除表,然后讓hibernate為您重新創建它。 如果可行,則映射中存在問題。

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

除此之外,使用我們的注釋配置,它看起來如下所示:

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

如果它適合你,可以考慮使用比內置類好得多的JodaTime DateTime類,你也可以使用Hibernate支持Hibernate支持它們

使用它們我用自定義Hibernate類型的注釋標記我的字段或getter:

@ org.hibernate.annotations.Type(type =“org.joda.time.contrib.hibernate.PersistentDateTime”)@Column(name =“date”)

這對我來說很好,它也生成正確的模式生成sql

這在MySQL中運行良好

在Temporal annonation旁邊使用TemporalType.TIMESTAMP。

請查看以下示例。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM