Подтвердить что ты не робот

Мой собственный идентификатор в 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. Но на этот раз обходной путь не сделал этого трюка.

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

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

4b9b3361

Ответ 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.