Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何让hibernate存储日期?_Mysql_Sql_Spring_Hibernate - Fatal编程技术网

Mysql 如何让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

我有一个Spring/Hibernate项目,我试图将一个日期存储到数据库中,但它不起作用。这一定很愚蠢,但我不知道我做错了什么

这是我的密码:

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);