2011-03-24 73 views
4

我有一個看起來像是否可以在grails中動態地爲域對象映射表名稱?

class Foo { 

    String name 

    static mapping = { 
    table 'foo'  
    } 
} 

一個域名,但我想說的是更象:

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

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

謝謝!

+0

感謝您的編輯伯特等人。 – Vinny 2011-03-28 21:42:16

+1

我覺得這個問題很有趣,請問爲什麼你想要這個動態名稱?我理所當然地想把我所有的Foo放在一張桌子上(不管是名爲Foo還是其他),但那是因爲我很難在盒子外面思考。感謝您的想法! – user639907 2011-03-25 17:16:08

回答

7

這是可能的。您可以添加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) 
} 
+0

要給這個方法一個鏡頭。如果它有效,肯定會標記它是正確的。謝謝! – Vinny 2011-03-25 17:18:08

+0

謝謝。這絕對是我嘗試去做的方式。獲取請求對象雖然很棘手。我會鏈接一篇關於本週晚些時候我如何做的博客文章。 – Vinny 2011-04-01 20:41:23

+0

@Vinny你最終做了那篇博客文章嗎? – Touniouk 2018-02-26 10:02:14

1

我不認爲這是可能的。在應用程序啓動時,評估mapping閉包,並生成Hibernate映射。在啓動時發生一次,所以不會發生動態分辨率。

multi-tenant-core插件中使用「單租戶」設置完成了一些可比較的事情,您爲每個租戶都有一個單獨的數據庫。

相關問題