2012-11-19 27 views
0

我想知道在運行時是否有方法在常規中更改grails類的static mapping部分。截至目前我的領域類看起來是這樣的:在運行時重定義域類映射

class Result { 

    ObjectId id 

    String url 

    def Result(){ 

    } 

    void addObjectProperty(String key, value){ 
     this[key]=value 
    } 

    //No constrains defined yet. 
    static constraints = { 
    } 

    static mapWith="mongo" 

    static mapping = { 
     collection "results" 
     database "test" 
    } 
} 

現在讓我們只想說,我想在運行時改變映射部分:

static mapping = { 
    collection "xyz" 
    database "mydb" 
} 

現在,當我打電話save()的對象上它保存導致在集合xyz中的mydb。我敢打賭,有一種方法可以實現這一點,但由於我是新手,所以我在這裏度過了一段艱難的時間......如果有人能夠指引我走向正確的方向,那將會很好。

非常感謝...

+1

即使這是可能的,我也不會這樣做。看起來像是一個正在等待發生的傷害世界。 – Gregg

+0

那麼你會怎麼做? – evermean

+1

這將取決於需要重新映射的原因。我從來沒有遇到過這樣一種情況:我需要更改映射,但不會以更持久的方式影響所有數據。 – Gregg

回答

2

請注意我的評論以上關於這樣做的智慧。也就是說,您可以使用Groovy的元類功能在運行時替換您的映射。

Result.metaClass.'static'.mapping = { 
    collection "myCollection" 
    database "myDatabase" 
} 

Grails中,映射塊是一個Groovy closure,讓你自由搭配,只要你喜歡的任何其他封閉的對象來代替它。這可能會有瘋狂的不可預知的Hibernate副作用,或者什麼也不做,因爲我不知道在Grails應用程序生命週期中何時使用映射閉包來配置Hibernate。

+0

這非常可怕。即使它起作用,你也可能搞砸你的數據庫關係。此外,你至少必須告訴hibernate重新加載映射,因爲它可能只會在grails應用程序啓動過程中完成(默認情況下)。 – Anarchofascist