Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Changing primary key id to String type in Grails

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?

like image 201
Patrick Marchwiak Avatar asked Jan 13 '12 19:01

Patrick Marchwiak


1 Answers

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.

like image 190
Burt Beckwith Avatar answered Sep 19 '22 00:09

Burt Beckwith