【问题标题】:Setting default value for Date field in Grails Domain Class在 Grails 域类中设置日期字段的默认值
【发布时间】:2013-12-10 17:56:28
【问题描述】:

我正在尝试为 Domain 类中的 Date 字段设置默认值。

我可以在mapping 配置中使用defaultValue,但它不适用于Date 字段(我已经在StringInteger 上尝试过,效果很好)。

这是一个例子:

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 ...

【问题讨论】:

    标签: grails grails-domain-class


    【解决方案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 用例;创建和更新。

    只需将关键字dateCreatedlastUpdated 包含在域的属性中,默认 功能就会发生。

    警告:如果他们的约束是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)
    }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-11-14
      • 2013-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-10
      • 1970-01-01
      • 2012-05-14
      • 1970-01-01
      相关资源
      最近更新 更多