2012-01-13 31 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這是一個字符串,它可以弄清楚。