Mysql 如何让hibernate存储日期?
我有一个Spring/Hibernate项目,我试图将一个日期存储到数据库中,但它不起作用。这一定很愚蠢,但我不知道我做错了什么 这是我的密码:Mysql 如何让hibernate存储日期?,mysql,sql,spring,hibernate,Mysql,Sql,Spring,Hibernate,我有一个Spring/Hibernate项目,我试图将一个日期存储到数据库中,但它不起作用。这一定很愚蠢,但我不知道我做错了什么 这是我的密码: user.setFailedPasswordAnswerAttemptCount(0); user.setLastLoginDate(new Date()); user.setIsOnline(true); 其他两个变量(failedPasswordAnswerAttemptCount和isOnline)正在毫无问题地写入数据库。我也尝试过只传递ja
user.setFailedPasswordAnswerAttemptCount(0);
user.setLastLoginDate(new Date());
user.setIsOnline(true);
其他两个变量(failedPasswordAnswerAttemptCount和isOnline)正在毫无问题地写入数据库。我也尝试过只传递java.util.Date而不是java.sql.Timestamp…同样的结果。以下是如何在用户对象上定义属性:
private Date lastLoginDate;
@Temporal(TemporalType.TIMESTAMP)
@Column(name="last_login_date")
public Date getLastLoginDate() {
return this.lastLoginDate;
}
public void setLastLoginDate(Date lastLoginDate) {
this.lastLoginDate = lastLoginDate;
}
以下是列定义:
`last_login_date` datetime DEFAULT NULL
有什么帮助吗?我甚至不知道还需要什么,因为这应该是有效的
关于错误的更多细节:hibernate日志中没有错误或奇怪的消息。hibernate日志显示了一个参数化查询,但它没有告诉我它实际上在写什么。看起来它根本没有更新列。换句话说,如果已经有一个日期,它不会改变,或者如果它是空的,它不会改变
更新:我查看了日志,看起来hibernate确实写入了正确的数据,但随后又立即写入了错误的数据。我在日志中看到以下条目:
11:15:12.280 [http-bio-8080-exec-26] TRACE o.h.e.def.AbstractSaveEventListener - detached instance of: com.hi.model.User
11:15:12.280 [http-bio-8080-exec-26] TRACE o.h.e.def.DefaultMergeEventListener - merging detached instance
在这之后,我看到它将旧值放回lastLoginDate。将列
last\u login\u date
设置为时间戳应该有效,至少对我有效。为什么要使用
不仅仅是这个?
首先-您可能不希望同时使用日期和时间戳。(例如,对于集合等)
Java平台库中有一些类确实扩展了实例
类并添加一个值组件。例如,java.sql.Timestamp
扩展java.util.Date并添加纳秒字段。平等执行
因为时间戳确实破坏了对称性,如果
时间戳和日期对象在同一个集合中使用或以其他方式混合使用。
Timestamp类有一个免责声明,警告程序员不要使用它
混合日期和时间戳。而只要你愿意,你就不会惹麻烦
把它们分开,没有什么能阻止你把它们混在一起
由此产生的错误可能很难调试。Timestamp类的这种行为是一个错误
错误,不应效仿。(布洛赫,有效Java,第二版)
第二,我检查了您的示例,它在mysql连接器(5.1.21)/hibernate(4.0.1)上运行良好
我准备了带有arquillian集成测试的简单测试项目(在运行jboss之前,您需要准备它):
如果您能提供更多信息,可能会有所帮助-hibernate版本、mysql版本、mysql引擎(MyISAM、InnoDB等)
否则,这可能只是一个配置错误。我发现了问题。我正在重构一些代码,看起来我正在这样做:
//get user object
User user = getUser();
//call a function which modifies user
functionModifiesUser();
//modify user
user.blah = blah;
entityManager.merge(user);
因此,当我试图保存用户对象时,父函数有一个过时的用户对象副本。实际上,删除merge语句就足以修复它了。但我已经重构了代码,将所有这些放在一个地方 失败是什么?它只是在写一个NULL
?它是否生成错误消息?是不是在日志中写了一些奇怪的东西?@DonalFellows我在我的文章末尾添加了更多的细节。映射问题?你试过将注释@column放在字段中而不是函数中吗?@julien我试过了,没什么区别。我在我的应用程序中几乎就是这么做的。我认为@Column注释中的长度定义看起来可疑。尝试删除它,只需使用user.setLastLoginDate(new Date());-对我有用。另外,如果您为org.hibernate设置跟踪日志记录,它将向您显示用于插入的参数值。问题是为什么它不起作用?我不太清楚你是如何认为这是对我问题的回答。那么,当你的列类型为datetime
,你为什么要用Timestamp
而不是Date
?java.sql.Timestamp只是比Date更具体。它是Date的一个子类。我试过另一种方法,没有什么不同。我一开始是用第二种方法。我将其更改为第1种方式(使用java.sql.Timestamp)以查看是否在传递日期时存在问题。我会给你回复配置细节。。。
user.setLastLoginDate(new Date());
//get user object
User user = getUser();
//call a function which modifies user
functionModifiesUser();
//modify user
user.blah = blah;
entityManager.merge(user);