2012-01-13 44 views
12

我的Grails 2.0的应用程序已经定义了用户域对象:更改主键ID为String类型的Grails

class User { 

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

当我尝试在我的引导文件保存一个新的用户,像这样:

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

我得到以下错误:

| 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 

我也试图改变用户类此:

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

    String id 
} 

这使得上述错误消失。但是,我发现这导致ID自动生成,完全忽略了generator: 'assigned'条款。

我在这里做错了什么?

回答

17

看起来像包裹在columns块是罪魁祸首。这可能在某些时候需要(在我的时间之前),但只要我使用过Grails,现在显然已经断开,它就是可选的。但你可以直接申报列映射:

class User { 

    String id 

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

只要字段声明为一个字符串,它的配置为assigned它会工作;没有必要告诉GORM这是一个字符串,它可以弄清楚。