Grails-在MySQL数据库中存储日期会丢失时间组件

Grails-在MySQL数据库中存储日期会丢失时间组件,grails,Grails,在带有日期字段的Grails2.2.5Web应用程序中,我遇到了一个相当令人费解的问题。我有一个策略域类,它有一个日期类型的'issued'属性。它没有特殊的映射,因此默认值将用于GORM。在MySQL数据库中,它的定义如下: 发布的日期时间默认值为空 当我将一个日期(如新日期)分配给“已发布”时,我可以从日志中看到它已正确分配: 2014-11-12 06:55:53014[http-bio-127.0.0.1-8001-exec-3]INFO test.PolicyService-记录发布日

在带有日期字段的Grails2.2.5Web应用程序中,我遇到了一个相当令人费解的问题。我有一个策略域类,它有一个日期类型的'issued'属性。它没有特殊的映射,因此默认值将用于GORM。在MySQL数据库中,它的定义如下:

发布的日期时间默认值为空

当我将一个日期(如新日期)分配给“已发布”时,我可以从日志中看到它已正确分配:

2014-11-12 06:55:53014[http-bio-127.0.0.1-8001-exec-3]INFO test.PolicyService-记录发布日期为2014年11月12日星期三06:55:53东部时间

但是,当我在policy.save之后立即再次测试它时,它丢失了时间组件:

2014-11-12 06:55:53051[http-bio-127.0.0.1-8001-exec-3]INFO test.PolicyService-保存后发布日期=美国东部时间2014年11月12日星期三00:00:00


我看不出这有什么原因。列的数据类型当然可以使用时间组件,我可以显式地设置一个时间组件。不知怎的,时间部分被删除了,我真的不知道该去哪里找。

谢天谢地,答案是我的编码错误,而不是一些奇怪的MySQL/Grails错误。我一直确信这一定是事实,但就是看不到它可能在哪里。但最终我发现了埋在“postUpdate”事件处理程序中的罪犯。我将'issued'属性“复制”到另一个日期变量,然后在该对象上使用clearTime,忘记了这也会清除'issued'属性上的时间,因为,当然,它根本不是副本,只是对同一对象的新引用。我将其更改为使用一个新的日期对象,该对象由'issued'属性中的getTime初始化,现在一切正常。愚蠢的错误


我错过了这一点,因为我正在查找分配给“已发布”的值的任何位置,这不属于这一类。

您可以尝试打开mysql日志,将general_log=1和general_log_file=/tmp/mysql_query.log添加到my.cnf-查看hibernate是否真的将时间组件发送到db…db表中是否也缺少时间组件?是的,数据库中缺少时间组件。我还没有尝试mysql日志本身,但我已经尝试了Grails中的Hibernate日志,可以看到Hibernate至少正在尝试发送时间组件。例如,我看到类似这样的内容:“绑定参数[77]为[TIMESTAMP]-Wed Nov 12 08:18:40 EST 2014”。但在db本身中,值是'2014-11-12 00:00:00',当我将其加载回Grails时,时间组件确实消失了。我不认为有什么东西是连接的,但对我来说是个谜,一些日期属性是这样分配的:绑定参数[77]为[TIMESTAMP]-Wed Nov 12 08:18:40 EST 2014,其中一些被分配如下:绑定参数[2]为[TIMESTAMP]-2014-11-12 08:18:39.0。属性的定义似乎是相同的,并且都是通过为它们分配新的日期来填充的,所以它似乎是随机的,尽管我确信它不可能是。当您说测试在测试环境中时?如果是这样的话,没有什么会持续下去……测试就是这样工作的。