Строковые идентификаторы в Grails - как именно это можно сделать? - PullRequest
4 голосов
/ 06 октября 2011

Может кто-нибудь показать мне понятный, полный, 100% рабочий способ установки поля со строковым типом в качестве идентификатора в граалях? Я прочитал документы, а затем прочитал все подобные публикации в Интернете, но не смог создать работающий прототип.

Вот одна из моих попыток убедить вас, что я не просто лениво жду, когда кто-нибудь выполнит эту работу)))

    class User {
  String login
  static hasMany = [apps : Application]

  static constraints = { 
  }

  static mapping = { 
    id generator: 'assigned', name: "login"
  }

}

Ответы [ 2 ]

8 голосов
/ 06 октября 2011

Когда вы используете натуральный идентификатор, вы должны использовать метод findBy вместо get , как показано в этом тесте:

def user = new User(login: "test")
assertNotNull user.save(flush: true)

user = User.findByLogin("test")
assertNotNull user
assertEquals "test", user.login

В качестве альтернативы вы можете использовать одно поле составной идентификатор отображение:

class User implements Serializable {
    String login

    static hasMany = [apps: Application]

    static constraints = {
    }

    static mapping = {
        id composite: ['login']
    }
}

Обратите внимание, что составные идентификаторы классы домена необходимы для реализации Serializable .

Тест для составного идентификатора будет:

def user = new User(login: "test")
assertNotNull user.save(flush: true)

user = User.get(new User(login: "test"))
assertNotNull user
assertEquals "test", user.login
3 голосов
/ 06 октября 2011

Я предполагаю, что вы говорите о сопоставлении первичного ключа String (обычно естественного ключа) с первичным ключом в доменном объекте grails.

Этот ответ получен из информации, найденной здесь: http://dsommerville.blogspot.com/2009/09/mapping-natural-keys-using-gorm.html и здесь: http://gr8fanboy.wordpress.com/2010/04/08/adding-a-natural-key-to-a-database-table-using-straight-gorm/

Например, у вас есть таблица Users, определенная по следующей схеме:

username    varchar(40) not null pimary key,
firstname   varchar(40) not null,
lastname    varchar(40) not null

Чтобы сделать это в Граале, вам нужно немного помассировать определение. Сначала вы должны сопоставить идентификатор с данным столбцом в вашей базе данных. С генератором "назначено"

Затем для удобства использования вы можете добавить временное поле username, чтобы вы могли использовать user.username =. В противном случае, я считаю, что вы должны получить доступ к полю, используя идентификатор. Получатель и установщик для этого переходного свойства устанавливают соответствующее поле «id», которое, в свою очередь, обновляет базу данных.

class User {
  String id
  String password
  String fullName

  static transients = ['username']

  static constraints = {
    id(unique:true,blank:false)
    password(nullable:true,maxSize:20)
    fullName(nullable:true,maxSize:20)
  }

  static mapping = {
    table 'users'
    id column: 'username', generator: 'assigned'
    version false
  }

  //
  void setUsername(String username) {
    id = username
  }

  String getUsername() {
    return id
  }
}

Примечание: Scaffolding не распознает переходное поле, поэтому вам придется работать с сгенерированными контроллерами / представлениями, если вы хотите, чтобы ваш код более точно моделировал вашу базу данных.

...