Каков наилучший способ определить генерацию пользовательского идентификатора по умолчанию в Grails?

Я хочу переключить свои классы домена, чтобы использовать UUID переменной длины для своих идентификаторов. Я не хочу просто отображать последовательные идентификаторы в URL-адресе, чтобы люди могли с ними повозиться. Я написал пользовательскую версию метода Java UUID, позволяющую использовать переменную длину, чтобы иметь более короткие идентификаторы для моделей, которые не будут увеличиваться в размерах.

Я нашел эту ветку, в которой объяснялось, как изменить сопоставление по умолчанию, чтобы я мог изменить его на «назначенное». Изменить создание идентификатора для подключаемого модуля Grails

Каков наилучший способ также настроить значение по умолчанию beforeInsert (для создания пользовательского UUID) и сообщить Grails, что я хочу использовать строки для идентификаторов вместо целых чисел?

Я попытался добавить grails.gorm.default.beforeInsert в конфигурацию, но это не сработало.


person ahanson    schedule 23.11.2010    source источник
comment
ответ ataylor ниже - это правильный способ сделать это в grails, но я обычно оставлял только идентификаторы, сгенерированные базой данных, и добавлял другое поле строки/GUID для объектов, которым требовался какой-то идентификатор корреляции, который может быть открыт для конечного пользователя . Таким образом, вы получаете нормальное поведение присоединения/внешнего ключа, на которое были настроены Grails/hibernate и базы данных (и писать SQL проще), но когда вам нужен этот внешний идентификатор, у вас есть и он.   -  person Ted Naleid    schedule 24.11.2010
comment
Это то, что я делал раньше, но я читал, что таким образом вы теряете кеш по умолчанию, поскольку он делает это по идентификатору. И поскольку я стараюсь ничего не делать против БД (или у нас есть альтернативный ключ), я попробую.   -  person ahanson    schedule 24.11.2010


Ответы (2)


Чтобы заставить Grails использовать строки для идентификаторов, просто объявите свойство String id. Чтобы заполнить его пользовательским UUID, я бы использовал генератор идентификаторов гибернации вместо beforeInsert. Создайте класс, который расширяет org.hibernate.id.IdentifierGenerator, затем добавьте сопоставление генератора идентификаторов, подобное этому, в класс вашего домена:

class MyIdGenerator extends IdentifierGenerator {
    Serializable generate(SessionImplementor session, Object object) {
        return MyUUID.generate()
    }
}

class MyDomain {
    String id
    static mapping = {
        id generator:"my.package.MyIdGenerator", column:"id", unique:"true"
    }
}
person ataylor    schedule 23.11.2010

Этот вопрос старый, но он все еще появляется в поиске. В настоящее время это лучший способ сделать это, примерно в версии Grails 2.3. (Я использую postgres, поэтому обратите внимание на тип «pg-uuid». Адаптируйте его к вашему конкретному хранилищу данных).

UUID uuid    
static mapping = {
    uuid generator: 'uuid2', type: 'pg-uuid'
    ...
}
person Travis Webb    schedule 11.08.2013