过去几个小时我一直在调试这个问题,但没有成功,我想我应该把它扔给 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 重新 check out ,但没有任何改进。现在我真的很困惑。
编辑 3:完全删除我的 MySql 安装,重新安装它,并从已知良好的副本恢复数据库也没有解决问题。
最佳答案
我的设置与你类似(除了我的作品),我的映射文件如下所示:
<property name="firstLoginDate" type="timestamp">
<column name="firstLoginDate" length="19"/>
</property>
我的数据库将列定义显示为日期时间。
编辑:
还有一些事情要检查...
- 检查mysql驱动是否相同 在您的本地和工作机器上。
- 尝试放下 table ,然后 hibernate 为你重新创建它。如果 那行得通,然后有一个问题 映射。
关于java - 使用 Hibernate 将 java.util.Date 持久化到 MySql 中时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1364397/