2016-12-23 3 views
1

Я пытаюсь написать генератор для углового-приложения CRUD (строительные леса, но на стороне клиента, используя угловой)Grails DefaultGrailsDomainClass.getIdentifier всегда возвращает «идентификатор в качестве идентификатора

Часть из них состоит на экстрагирование метаинформация от GORM Теперь, видимо, я ударил по твердой стене.

Я хочу обрабатывать случай, когда поле ID не генерируется, но управляется приложением. Скажем, у меня есть определение класса, как:

@Resource(readOnly = false, formats = ['json', 'xml']) 
class Phone { 

    int age 
    String phoneId 
    String imageUrl 
    String name 
    String snippet 

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

    static constraints = { 
     snippet(nullable: true, maxSize: 2000) 
    } 
} 

Я хотел бы, чтобы получить поле, служащий в качестве идентификатора для этого класса, который здесь должен быть "phoneId.

Но если спросить:

grailsApplication.getDomainClass(com.phonecat.Phone.getName()).identifier 

Что я получаю взамен это свойство, называемое 'идентификатор' типа Long:

[email protected] name = 'id', type = Long, persistent = true, optional = false, association = false, bidirectional = false, association-type = [null]] 

Am I неправильно используя метод getIdentifier? Есть ли что-то, что я пропустил? Или я ударил ошибку в Grails/GORM?

Для полноты, вот версия GORM я использую (насколько я могу сказать ... так что многое изменилось в последнее время на стороне Горм ...):

из build.groovy:

compile "org.grails.plugins:hibernate5" 
compile "org.hibernate:hibernate-core:5.1.2.Final" 
compile "org.hibernate:hibernate-ehcache:5.1.2.Final" 

Кроме того, я использую Grails консоли плагин для запуска этих тестов:

runtime 'org.grails.plugins:grails-console:2.0.6' 

(которые я нахожу действительно здорово) Но, наверное, то же самое можно запустить из в пределах нормы консоль командной строки.

Вот код, который я использовал:

import com.phonecat.* 

println grailsApplication.getDomainClass(Phone.getName()).identifier 

def d = grailsApplication.getDomainClass(Phone.getName()) 
println "${d.class} ${d.clazz.name} ${d.identifier}" 

def pd = Phone.findAll().each {c -> 
    println "${c.id} ${c.phoneId}" 
} 
null 

Возникает вопрос: предположим, что (как это происходит на самом деле быть ...), что я пишу плагин для получения мета-информации о домене класс; Как я могу получить из GORM информацию о том, что этому классу было присвоено поле «phoneId» как уникальный идентификатор, и это значение, которое я должен посмотреть при запросе ресурса через REST?

+0

Вы пытались изменить 'String phoneId' на' String id'? Кроме того, не забудьте удалить «phoneId» из ограничений. –

+0

@Michael_Szulc: phoneId() внутри ограничений было только для обеспечения порядка, в котором поля отображаются при использовании строительных лесов. Они действительно бесполезны для этого вопроса. Я пробовал то, что вы предлагаете, и в этом случае метод идентификатора корректно сообщает идентификатор имени «id» и тип String. НО это не решит мою проблему: я пытаюсь изменить свою модель. Я на самом деле пишу плагин, который будет получать метаинформацию моей модели (так же, поле идентификатора).Поэтому я хочу, чтобы метод получил имя поля, которое кто-либо дал как уникальный идентификатор – precchia

ответ

0

Как правило, вы должны использовать API GORM вместо GrailsDomainClass, если хотите проверить соответствие модели. Для этого вам нужно получить ссылку на MappingContext (это может быть зависимость, введенная Spring). Затем:

PersistentEntity entity = mappingContext.getPersistentEntity(Phone.name) 
println entity.identity.name 
+0

Упс! Не заметил, что сам Бог ответил на мой вопрос ... Спасибо Грэм за это. не знал о MappingContext. И, да, это определенно работает. Я правильно вернул идентификатор с именем «phoneId» и напечатал String. Теперь ... это будет означать, что мне придется реорганизовать весь мой код. Но наверняка это станет намного чище. – precchia

 Смежные вопросы

  • Нет связанных вопросов^_^