我的域名看起来像
class Foo {
String name
static mapping = {
table 'foo'
}
}
但我想做的更像是:
static mapping = {
table "foo_${dynamicVarThatComesFromRequest}"
}
我想知道的是,这是否可能?
谢谢!
答案 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插件中进行了类似的操作,使用“单租户”设置,每个租户都有一个单独的数据库。