我的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这是一个字符串,它可以弄清楚这一点。

10-08 02:05