2013-03-17 1 views
0

Я в настоящее время есть следующий код, чтобы определить мой класс «Пользователь»Что такое правильный способ, чтобы разрешить имя таблицы, чтобы изменить с помощью конфигурации в Grails/GORM

class User 
{ 
    String username 

    static mapping = { 
    table ConfigurationHolder.config.console.datasource.table.user.mapping ?: 'user' 
    } 
} 

Это прекрасно работает с Грааль 1.3.5 , но после обновления до 2.2.1, Грайлс продолжает жаловаться на то, что ConfigurationHolder устарел.

Так что технически это «все еще» отлично работает, но что произойдет, как только они удалят этот класс. В документации говорится: «Вместо этого используйте инъекцию зависимостей». Но я не могу использовать инъекцию зависимостей, так как mapping является статическим.

Реальный вопрос - что такое «правильный» способ разрешить переименование таблицы через конфигурацию?

Благодаря Ян

+1

возможно дубликат [? Как получить доступ к конфигурации в Grails Grails 2.0] (http://stackoverflow.com/questions/7133580/how-to-access-grails-configuration- in-grails-2-0) – codelark

+0

Это похоже на дубликат, но реальный вопрос заключается в том, как правильно переименовать таблицу через конфигурацию. Кажется, что предоставление вашей собственной «NamingStrategy» должно сделать трюк ... улов заключается в том, как вводить в него конфигурацию ... – yan

+0

Я нашел этот старый билет на Джиру. Возможно, это работает. http://jira.grails.org/browse/GRAILS-3680 – Bart

ответ

1

Вы можете использовать grails.util.Holders класс, чтобы получить доступ к конфигурации:

class User 
{ 
    String username 

    static mapping = { 
     table Holders.config.console?.datasource?.table?.user?.mapping ?: 'user' 
    } 
} 
+0

Я подтверждаю, что это решение работает. Мне просто интересно, почему Grails осуждает ConfigurationHolder (хотя вместо этого указывается использование инъекции зависимостей) и предоставляет другое значение для доступа к нему с использованием другого шаблона «держателя» ... – yan

1

ApplicationContext пропускается к закрытию отображения в качестве первого параметра.

См. http://jira.grails.org/browse/GRAILS-8087 и исходный код для деталей: https://github.com/grails/grails-core/blob/2.2.x/grails-hibernate/src/main/groovy/org/codehaus/groovy/grails/orm/hibernate/cfg/HibernateMappingBuilder.groovy#L61.

Пример использования:

class User 
{ 
    String username 

    static mapping = { ctx -> 
     table ctx.grailsApplication.config.console?.datasource?.table?.user?.mapping ?: 'user' 
    } 
} 
+0

Это решение не работает: 2013/03/25 15: 11: 30.934 ОШИБКА [GrailsContextLoader] Ошибка инициализации приложения: Ошибка оценки блока сопоставлений ORM для домена [org.linkedin.glu.console.domain.User]: Нет такого свойства: grailsApplication для класса: org.springframework.web.context.support .XmlWebApplicationContext – yan

+0

yan, какую версию Grails вы используете? –

+0

Я использую самую последнюю из этих статей (2.2.1) – yan