我在过去几个小时里一直在调试这个问题而没有成功,并且认为我会把它扔到SO那里看看它在哪里。
我正在开发一个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 :(得分:1)
我有类似的设置(除了我的工作),我的映射文件如下所示:
<property name="firstLoginDate" type="timestamp">
<column name="firstLoginDate" length="19"/>
</property>
我的数据库将列定义显示为datetime。
编辑:
还有更多要检查的事情......
答案 1 :(得分:0)
这可能是您的问题,也可能不是,但我们在日期/时间信息方面遇到了严重问题 - 如果您的数据库服务器与提交数据的机器位于不同的时区,则可能会导致数据保存不一致。
除此之外,使用我们的注释配置,它看起来如下所示:
@Column(name="COLUMN_NAME", length=11)
答案 2 :(得分:0)
如果你可以使用它,可以考虑使用比内置类好得多的JodaTime DateTime类,你也可以使用Hibernate支持Hibernate来持久化它们
使用它们我用自定义Hibernate类型的注释标记我的字段或getter:
@ org.hibernate.annotations.Type(type =“org.joda.time.contrib.hibernate.PersistentDateTime”) @Column(name =“date”)
这对我来说很好,它也可以生成正确的模式生成sql
这在MySQL中运行良好
答案 3 :(得分:-1)
在Temporal annonation旁边使用TemporalType.TIMESTAMP。
请查看以下示例。
@Temporal(TemporalType.TIMESTAMP)
public Date getCreated() {
return this.created;
}