我的Grails 2.0应用程序定义了一个User域对象:
class User {
static mapping = {
table "dt_user"
columns {
id column:'user_id', generator:'assigned', type:'string'
}
}
当我尝试像这样在BootStrap文件中保存新用户时:
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
我也尝试将User类更改为此:
class User {
static mapping = {
table "dt_user"
columns {
id column:'user_id', generator:'assigned', type:'string', name:'id'
}
}
String id
}
从而使上述错误消失了。但是我发现这导致id自动生成,完全忽略了
generator: 'assigned'
子句。我在这里做错了什么?
最佳答案
似乎将其包装在columns
块中是罪魁祸首。这可能在某个时候(在我之前)是必需的,但是它是可选的,只要我使用过Grails,并且现在看来已经坏了。但是您可以直接声明列映射:
class User {
String id
static mapping = {
table "dt_user"
id column: 'user_id', generator: 'assigned'
}
}
只要将该字段声明为String并将其配置为
assigned
,它将起作用;无需告诉GORM这是一个字符串,它可以弄清楚这一点。