Мой собственный идентификатор в GORM
Я попытался изменить стандартный "id" в grails:
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. Но на этот раз обходной путь не сделал этого трюка.
Любые предложения?
Я знаю, я могу переименовать идентификатор, но тогда мне придется менять все видимые виды...
Ответы
Ответ 1
Это особенность привязки данных. Вы не хотите, чтобы предоставленные данные могли изменять управляемые поля, такие как id
и version
, поэтому используемый вами конструктор Map связывает все доступные свойства, кроме этих двух (он также игнорирует любое значение для class
, metaClass
и еще несколько других).
Итак, здесь немного рассогласование, поскольку значение не управляется Hibernate/GORM, но вами. Как вы видели, обходной путь заключается в том, что вам нужно создать объект в два шага вместо одного.
Ответ 2
Я не могу реплицировать эту проблему (используется 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)
}
И это отлично работает для меня. Я вижу id как 123abc.