【发布时间】: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=1和general_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