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

Vin*_*nny 5 database grails grails-orm

我有一个看起来像的域名

class Foo {

  String name

  static mapping = {
     table 'foo'    
  }
}
Run Code Online (Sandbox Code Playgroud)

但我想做的更像是:

static mapping = {
   table "foo_${dynamicVarThatComesFromRequest}"
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Lar*_*ari 8

有可能的.您可以添加一个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) 
    }

}
Run Code Online (Sandbox Code Playgroud)

的grails-app/CONF /弹簧/ resources.groovy:

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