在 Grails 中将主键 id 更改为字符串类型

Posted

技术标签:

【中文标题】在 Grails 中将主键 id 更改为字符串类型【英文标题】:Changing primary key id to String type in Grails 【发布时间】:2012-02-09 23:55:21 【问题描述】:

我的 Grails 2.0 应用定义了一个用户域对象:

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' 子句。

我在这里做错了什么?

【问题讨论】:

【参考方案1】:

看起来将它包装在 columns 块中是罪魁祸首。这可能在某些时候(在我之前)是必需的,但只要我使用过 Grails 并且显然现在已经损坏,它就是可选的。但是你可以直接声明列映射:

class User 

   String id

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

只要该字段被声明为字符串并且它被配置为assigned,它就可以工作;不需要告诉 GORM 它是一个字符串,它可以识别出来。

【讨论】:

以上是关于在 Grails 中将主键 id 更改为字符串类型的主要内容,如果未能解决你的问题,请参考以下文章

在 Grails Spring Security 插件中将 AccessDecisionManager 更改为 UnanimousBased

ASP.NET Identity - 将用户 ID 主键默认类型从字符串更改为 int 以及使用自定义表名时出错

如何在Mongodb中将字符串数据类型大量更改为int?

在postgres中将主键和外键更改为整数

在数据库项目中将 Int 更改为 uniqueidentifier

在 Pyspark 中将列类型从字符串更改为日期