мой собственный идентификатор в GORM - PullRequest
19 голосов
/ 27 октября 2011

Я пытался изменить стандартное 'id' в граалях:

calls Book {
  String id
  String title

  static mapping {
    id generator:'assigned'
  }
}

к сожалению, я скоро заметил, что это ломает мой загрузчик.Вместо

new Book (id:'some ISBN', title:'great book').save(flush:true, failOnError:true)

мне пришлось использовать

def b = new Book(title:'great book')
b.id = 'some ISBN'
b.save(flush:true, failOnError:true)

, в противном случае я получаю 'идентификаторы для этого класса должны быть назначены вручную перед вызовом ошибки save ()'.

но пока это нормально.

Затем я столкнулся с той же проблемой в действии сохранения моего bookController.Но на этот раз обходной путь не сработал.

Любые предложения?

Я знаю, я могу переименовать идентификатор, но тогда мне придется изменить все представления лесов ...

Ответы [ 3 ]

18 голосов
/ 27 октября 2011

Это особенность привязки данных. Вы не хотите, чтобы представленные данные могли изменять управляемые поля, такие как id и version, поэтому используемый вами конструктор Map связывает все доступные свойства, кроме этих двух (он также игнорирует любое значение для class, metaClass и некоторые другие).

Таким образом, здесь есть некоторое несоответствие, так как значение управляется не Hibernate / GORM, а вами. Как вы видели, обходной путь заключается в том, что вам нужно создать объект за два шага, а не за один.

6 голосов
/ 31 октября 2011

Я не могу воспроизвести эту проблему (использовал Grails 2.0.RC1).Я думаю, что это может быть так же просто, как пропустить знак равенства на вашем статическом отображении = {(у вас просто есть статическое отображение {)

Вот код для объекта домена:

class Book {
    String id
    String name

    static mapping = {
        id generator:'assigned'               
    }
}

Внутри BootStrap.groovy:

def init = { servletContext ->
    new Book(name:"test",id:"123abc").save(failOnError:true)
}

И у меня работает нормально.Я вижу идентификатор как 123abc.

0 голосов
/ 03 июля 2019

Вам необходимо установить ограничение bindable на true для вашего идентификатора, например.

class Employee {
    Long id
    String name

    static constraints = {
        id bindable: true
    }
}
...