Изменение идентификатора первичного ключа на тип String в Grails - PullRequest
12 голосов
/ 13 января 2012

В приложении My 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 
}

, из-за которого вышеперечисленные ошибки исчезли. Однако я обнаружил, что это привело к автоматической генерации идентификаторов, полностью игнорируя предложение generator: 'assigned'.

Что я здесь не так делаю?

1 Ответ

19 голосов
/ 14 января 2012

Похоже, что завернуть его в блок columns - виновник. Это могло потребоваться в какой-то момент (до моего времени), но это было необязательно, если я использовал Grails и, по-видимому, теперь не работает. Но вы можете просто объявить сопоставления столбцов напрямую:

class User {

   String id

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

Пока поле объявлено как String и настроено как assigned, оно будет работать; нет необходимости говорить GORM, что это String, он может это понять.

...