【问题标题】:Grails - storing Date in MySQL db loses time componentGrails - 在 MySQL 数据库中存储日期会丢失时间组件
【发布时间】:2014-11-12 12:28:47
【问题描述】:

我在带有日期字段的 Grails 2.2.5 Web 应用程序中遇到了一个相当令人费解的问题。我有一个 Policy 域类,它有一个 Date 类型的“已发布”属性。它没有特殊的映射,因此 GORM 将使用默认值。在 MySQL 数据库中,它是这样定义的:

issued datetime 默认为空

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

2014-11-12 06:55:53,014 [http-bio-127.0.0.1-8001-exec-3] INFO test.PolicyService - 记录发布日期为 2014 年 11 月 12 日星期三 06:55:53 EST

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

2014-11-12 06:55:53,051 [http-bio-127.0.0.1-8001-exec-3] INFO test.PolicyService - 保存后发布日期 = 2014 年 11 月 12 日星期三 00:00:00 EST

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

【问题讨论】:

  • 您可以尝试开启 mysql 日志记录(将 general_log=1general_log_file=/tmp/mysql_query.log 添加到 my.cnf) - 看看 hibernate 是否真的将时间组件发送到 db...
  • db表中是否也缺少时间分量?
  • 是的,数据库中缺少时间组件。我还没有尝试过 mysql 日志记录本身,但我已经在 Grails 中尝试过 Hibernate 日志记录,并且可以看到 Hibernate 至少正在尝试发送时间组件。例如,我看到类似:'binding parameter [77] as [TIMESTAMP] - Wed Nov 12 08:18:40 EST 2014'。但是在db本身中,该值为'2014-11-12 00:00:00',当我将其加载回Grails时,时间组件确实消失了。
  • 一些我认为没有关联但对我来说很困惑的东西是,一些 Date 属性是这样分配的:binding parameter [77] as [TIMESTAMP] - Wed Nov 12 08:18:40 EST 2014,有些是这样分配的:binding parameter [2] as [TIMESTAMP] - 2014-11-12 08:18:39.0。这些属性的定义似乎相同,并且两者都是通过分配给它们的 new Date() 来填充的,所以它似乎是随机的,尽管我确信它不可能。
  • 当你说“测试”是在测试环境中?如果是这样,什么都不会持续......这就是测试的工作原理。

标签: grails


【解决方案1】:

谢天谢地,答案是我的编码错误,而不是一些奇怪的 MySQL/Grails 错误。我一直确信一定是这样,但就是看不到它可能在哪里。但最后我发现了埋在“postUpdate”事件处理程序中的罪魁祸首。我已将“已发布”属性“复制”到另一个日期变量,然后在该对象上使用了 clearTime(),忘记了这也会清除“已发布”属性上的时间(因为,当然,它不是全部,只是对同一对象的新引用)。我将其更改为使用使用“已发布”属性中的 getTime() 初始化的新 Date 对象,现在一切正常。笨拙的错误!

我错过了这个,因为我正在寻找任何一个值被分配给“已发布”的地方,而这不属于该类别。

【讨论】:

    猜你喜欢
    • 2013-01-26
    • 2014-05-04
    • 2021-09-27
    • 2017-05-31
    • 1970-01-01
    • 2019-04-26
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    相关资源
    最近更新 更多