我有一個看起來像是否可以在grails中動態地爲域對象映射表名稱?
class Foo {
String name
static mapping = {
table 'foo'
}
}
一個域名,但我想說的是更象:
static mapping = {
table "foo_${dynamicVarThatComesFromRequest}"
}
我想知道的是這是否可能?
謝謝!
我有一個看起來像是否可以在grails中動態地爲域對象映射表名稱?
class Foo {
String name
static mapping = {
table 'foo'
}
}
一個域名,但我想說的是更象:
static mapping = {
table "foo_${dynamicVarThatComesFromRequest}"
}
我想知道的是這是否可能?
謝謝!
這是可能的。您可以添加Hibernate攔截器來處理所有SQL語句,並在映射中輸入的表名中解析/替換某個標記,並使用您想要使用的實際表名稱。
SRC /常規/ 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)
}
我不認爲這是可能的。在應用程序啓動時,評估mapping
閉包,並生成Hibernate映射。在啓動時發生一次,所以不會發生動態分辨率。
在multi-tenant-core插件中使用「單租戶」設置完成了一些可比較的事情,您爲每個租戶都有一個單獨的數據庫。
感謝您的編輯伯特等人。 – Vinny 2011-03-28 21:42:16
我覺得這個問題很有趣,請問爲什麼你想要這個動態名稱?我理所當然地想把我所有的Foo放在一張桌子上(不管是名爲Foo還是其他),但那是因爲我很難在盒子外面思考。感謝您的想法! – user639907 2011-03-25 17:16:08