Можно ли динамически отображать имя таблицы для объекта домена в Grails? - PullRequest
5 голосов
/ 24 марта 2011

У меня есть домен, который выглядит примерно так:

class Foo {

  String name

  static mapping = {
     table 'foo'    
  }
}

, но я хочу сделать это больше похоже на:

static mapping = {
   table "foo_${dynamicVarThatComesFromRequest}"
}

Что я хочу знать, возможно ли это?

Спасибо!

Ответы [ 2 ]

8 голосов
/ 25 марта 2011

Это возможно.Вы можете добавить перехватчик Hibernate для обработки всех операторов SQL и синтаксического анализа / замены некоторых токенов в имени таблицы, которое вы вводите в отображении, на фактическое имя таблицы, которое вы хотите использовать.

import org.hibernate.EmptyInterceptor

public class DynamicTableNameInterceptor extends EmptyInterceptor {

    public String onPrepareStatement(String sql) {
         // some kind of replacement logic here
         def schema=SomeHelperClass.resolveSchema()
         return sql.replaceAll('_SCHEMA_', schema) 
    }

}

grails-app / conf / spring / resources.groovy:

beans = {
    // This is for Grails 1.3.x , in previous versions, the bean name is eventTriggeringInterceptor
    entityInterceptor(DynamicTableNameInterceptor)
}
1 голос
/ 25 марта 2011

Я не думаю, что это возможно. После запуска приложения оценивается закрытие mapping и в результате генерируется отображение Hibernate. Это происходит один раз при запуске, поэтому динамическое разрешение не произойдет.

Нечто сопоставимое делается в плагине multi-tenant-core , используя настройку 'single tenant', у вас есть отдельная база данных для каждого арендатора.

...