是否可以在grails中动态映射域对象的表名?

时间:2011-03-24 19:00:47

标签: database grails gorm

我的域名看起来像

class Foo {

  String name

  static mapping = {
     table 'foo'    
  }
}

但我想做的更像是:

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

我想知道的是,这是否可能?

谢谢!

2 个答案:

答案 0 :(得分:7)

有可能。您可以添加一个Hibernate拦截器来处理所有SQL语句,并解析/替换您在映射中输入的表名中的一些标记,并使用您想要使用的实际表名。

src / groovy / DynamicTableNameInterceptor.groovy:

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 /弹簧/ resources.groovy:

beans = {
    // This is for Grails 1.3.x , in previous versions, the bean name is eventTriggeringInterceptor
    entityInterceptor(DynamicTableNameInterceptor)
}

答案 1 :(得分:1)

我认为这不可行。应用程序启动时,将评估mapping闭包,并生成Hibernate映射。这在启动时发生一次,因此不会发生动态分辨率。

multi-tenant-core插件中进行了类似的操作,使用“单租户”设置,每个租户都有一个单独的数据库。

相关问题