2012-01-13 6 views
12

Grails My 2.0 ứng dụng có một đối tượng miền Người dùng xác định:Thay đổi id khóa chính để loại Chuỗi trong Grails

class User { 

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

Khi tôi cố gắng tiết kiệm một tài khoản mới trong file bootstrap tôi như vậy:

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

tôi nhận được lỗi sau:

| 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 

tôi cũng đã cố gắng thay đổi lớp người dùng này:

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

    String id 
} 

làm cho các lỗi ở trên biến mất. Tuy nhiên tôi thấy rằng điều này dẫn đến các id được tạo tự động, hoàn toàn bỏ qua mệnh đề generator: 'assigned'.

Tôi đang làm gì sai ở đây?

Trả lời

17

Dường như gói nó trong khối columns là thủ phạm. Điều này có thể đã được yêu cầu tại một số điểm (trước thời gian của tôi) nhưng nó được tùy chọn miễn là tôi đã sử dụng Grails và rõ ràng là bây giờ đã bị hỏng. Nhưng bạn chỉ có thể tuyên bố ánh xạ cột trực tiếp:

class User { 

    String id 

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

Chừng nào lĩnh vực này được khai báo là một String và nó được cấu hình như assigned nó sẽ làm việc; không cần phải nói với GORM nó là một String, nó có thể hình dung ra điều đó.