使用Hibernate将java.util.Date持久化到MySql中的问题

我在过去的几个小时里一直在调试这个问题而没有成功,并且认为我会把它扔到SO那里看看它到底发生了什么。

我正在开发一个Java程序,它使用Hibernate和DAO / DTO模式将数据保存到MySql数据库中。 在我的数据库中,我有一个带有firstLoginDate列的memberprofile表。 在数据库中,该列的SQL类型是DateTime。 Hibernate XML文件的相应部分是

    

但是,当我尝试将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安装,重新安装它,并从已知的良好副本还原数据库也无法解决问题。

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

    

我的数据库将列定义显示为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; }