Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Setting default value for Date field in Grails Domain Class

I'm trying to set a default value for a Date field in a Domain class.

I can use defaultValue in the mapping configuration but it doesn't work with Date fields (I've tried it on String and Integer and it works fine).

This is an example:

class Something {

    Date myField

    static mapping = {
        myField defaultValue: new Date()
    }

}

This code fails because the CREATE statement that Hibernate generates is incorrect. It is something like:

... my_field datetime default Mon Nov 25 17:59:08 UYST 2013 not null ...
like image 408
mathifonseca Avatar asked Nov 25 '13 20:11

mathifonseca


2 Answers

You can always initialize the field in the static initializer or set the value in the constructor:

class Something {
    // initializer
    Date myField = new Date()

    // or in the ctor
    Something() {
        myField = new Date()
    }
}

This doesn't set a default value in the database schema, it merely sets the value of the field on creation of the instance. If you want the schema to have a default value, you can use the 'defaultValue' mapping entry like so:

class Something {
    Date myField

    static mapping = {
        myField defaultValue: "now()"
    }
}

the value you set for the default value is dependent on your database vendor. (notice the use of sql now() method rather than Java/Groovy new Date().

like image 96
codelark Avatar answered Oct 20 '22 00:10

codelark


GORM readily caters for the most basic Date use cases; create and update.

Simply include keywords dateCreated and lastUpdated into the domain's properties for the default functionality to occur.

Warning: If their constraints are nullable: false this will cause a fail. Either remove those constraints or set autoTimestamp to false.

For example:

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

Read the more about groovy dates at this SO answer, the groovy date api, and GORM's date-event features here

like image 2
Koffy Avatar answered Oct 20 '22 02:10

Koffy