【问题标题】:Set a Grails domain attribute's defaultValue to Joda-Time Period.ZERO将 Grails 域属性的 defaultValue 设置为 Joda-Time Period.ZERO
【发布时间】:2014-04-03 01:04:27
【问题描述】:

我一直在为 Grails 使用 Joda-Time 插件。我真的开始喜欢它了,但是,我正在尝试为域属性(期间类型:PersistentPeriod)设置一个默认值。一切都很好。我可以保存和检索 Joda-Time 数据,标签库运行良好,计算和转换完美无缺,但是,当我在为 Joda-Time 属性设置默认值后尝试编译时,一切都崩溃了。 示例:

class Person { 
    DateTime date 
    Period totalTime 
    static mapping = {
        totalTime (type: PersistentPeriod, defaultValue:Period.ZERO)
        date (type: PersistentDateTime, defaultValue:DateTime.now())
    } 
}

有没有办法使用默认值来做到这一点,或者我应该将 Joda-Time 属性保持为空和空白。

【问题讨论】:

  • 到底发生了什么?请提供堆栈跟踪或错误描述。
  • SchemaExport 不成功:未找到 SchemaExport 列“PT0S”; SQL 语句:未找到 SchemaExport 表“ACCT_SHIFT”; SQL 语句:

标签: grails plugins grails-orm jodatime


【解决方案1】:

指定“defaultValue”不会以您尝试使用它的方式起作用。它旨在用作 MySQL 在指定创建表语法时可以使用的默认值。如果您只是想要任何没有将值设置为默认值的类,那么像这样重写您的 Person 类:

class Person { 
  DateTime date = DateTime.now() 
  Period totalTime = Period.ZERO
  static mapping = {
    totalTime (type: PersistentPeriod)
    date (type: PersistentDateTime)
  } 
}

或者,您可以使用 defaultValue: "CURRENT_TIMESTAMP" for DateTime.now() by MySQL 将期望字段类型为“TIMESTAMP”而不是“DATETIME”,以便它工作。

【讨论】:

  • 这行得通。我想我误解了 defaultValue 的使用。感谢您清除它。
  • 在研究了更多关于 defaultValue 并考虑到@th3morg cmets 之后,我意识到映射闭包中的“defaultValue”特别影响数据库的创建和更新。因此,分配给 defaultValue 的值必须对应于我正在使用的数据库的“本机”数据类型。所以这有效:totalTime (type: PersistentPeriod, defaultValue:"PT0S") -- "PT0S" 是 Joda-Time 存储在数据库列中的实际字符串,一个 varchar(255)。
  • 在属性中声明一个默认值,'Period totalTime = Period.ZERO' 由 GORM 在应用程序保存/更新域对象并且总时间没有值/空值时使用属性。 See this Nabble post about defaultValue. 我想我理解正确。如果我错了,请纠正我。
  • ... 以及对该主题的另一个修正。 “PT0S”不起作用。没有具体键入。 “'PT0S'”有效。
  • ... 和另一个。映射闭包中的日期可以这样设置:日期类型:PersistentDateTime,默认值:“now()”。这也适用于标准 Grails Date 数据类型。 See this other StackOverflow question
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-26
  • 1970-01-01
  • 1970-01-01
  • 2014-08-14
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多