在 Grails 域类中设置日期字段的默认值
Posted
技术标签:
【中文标题】在 Grails 域类中设置日期字段的默认值【英文标题】:Setting default value for Date field in Grails Domain Class 【发布时间】:2013-12-10 17:56:28 【问题描述】:我正在尝试为 Domain 类中的 Date
字段设置默认值。
我可以在mapping
配置中使用defaultValue
,但它不适用于Date
字段(我已经在String
和Integer
上尝试过,效果很好)。
这是一个例子:
class Something
Date myField
static mapping =
myField defaultValue: new Date()
此代码失败,因为 Hibernate 生成的 CREATE 语句不正确。是这样的:
... my_field datetime default Mon Nov 25 17:59:08 UYST 2013 not null ...
【问题讨论】:
【参考方案1】:您始终可以在静态初始化程序中初始化字段或在构造函数中设置值:
class Something
// initializer
Date myField = new Date()
// or in the ctor
Something()
myField = new Date()
这不会在数据库模式中设置默认值,它只是在创建实例时设置字段的值。如果您希望架构具有默认值,则可以使用“defaultValue”映射条目,如下所示:
class Something
Date myField
static mapping =
myField defaultValue: "now()"
您为默认值设置的值取决于您的数据库供应商。 (注意使用 sql now()
方法而不是 Java/Groovy new Date()
。
【讨论】:
谢谢!我认为这是解决方案,但不想要像 now() 那样的数据库引擎特定功能【参考方案2】:GORM 可以轻松满足最基本的Date
用例;创建和更新。
只需将关键字dateCreated
和lastUpdated
包含在域的属性中,默认 功能就会发生。
警告:如果他们的约束是nullable: false
,这将导致失败。要么删除这些约束,要么将 autoTimestamp
设置为 false。
例如:
class MyDomain
Date dateCreated
Date lastUpdated
Date yesterday = new Date().previous()
Date weekAgo = new Date() - 7
Date monthAgo = new Date() - 30
Date usaIndepenceDay = new Date().copyWith(
year: 1776,
month: Calendar.JULY,
dayOfMonth: 4,
hourOfDay: 0,
minute: 0,
second: 0)
static mapping =
//autoTimestamp false
static constraints =
//dateCreated nullable: false
在this SO answer、groovy date api 和 GORM 的日期事件功能here 上阅读更多关于常规日期的信息
【讨论】:
谢谢,我已经知道 dateCreated 和 lastUpdated 字段,但这些与我原来的问题无关:D 我松散地将它们扔在那里,因为我在 grails 日期上找不到好的快速答案,并添加了一些易于消化的内容 如何将默认日期设置为明天的日期?或者说四天后?【参考方案3】:您可以将其用于从系统日期自动获取的默认装箱日期
class User
String userName
String firstName
String lastName
Date createdDate = new Date() // set system date
static mapping =
version false
id generator: 'increment'
cache true
static constraints =
userName(unique: true)
【讨论】:
以上是关于在 Grails 域类中设置日期字段的默认值的主要内容,如果未能解决你的问题,请参考以下文章