Changing primary key id to String type in Grails

Patrick Marchwiak picture Patrick Marchwiak · Jan 13, 2012 · Viewed 10.9k times · Source

My Grails 2.0 app has a User domain object defined:

class User {

static mapping = {
    table "dt_user"
    columns {
      id column:'user_id', generator:'assigned', type:'string'
    }
}

When I try to save a new User in my BootStrap file like so:

def user = new User(id: "smith").save(failOnError:true)

I get the following error:

| Error 2012-01-13 10:09:42,659 [main] ERROR property.BasicPropertyAccessor  - IllegalArgumentException in class: User, setter method of property: id
| Error 2012-01-13 10:09:42,660 [main] ERROR property.BasicPropertyAccessor  - expected type: java.lang.Long, actual value: java.lang.String

I also tried changing the User class to this:

class User {
    static mapping = {
        table "dt_user"
        columns {
            id column:'user_id', generator:'assigned', type:'string', name:'id'
        }
    }

    String id 
}

which made the above errors go away. However I found that this resulted in ids being generated automatically, completely ignoring the generator: 'assigned' clause.

What am I doing wrong here?

Answer

Burt Beckwith picture Burt Beckwith · Jan 14, 2012

Looks like wrapping it in the columns block is the culprit. This may have been required at some point (before my time) but it's been optional as long as I've used Grails and apparently is now broken. But you can just declare column mappings directly:

class User {

   String id

   static mapping = {
      table "dt_user"
      id column: 'user_id', generator: 'assigned'
   }
}

As long as the field is declared as a String and it's configured as assigned it will work; there's no need to tell GORM it's a String, it can figure that out.