在运行时重新定义域类映射

时间:2012-11-19 16:42:20

标签: grails dynamic groovy mapping

我想知道在groovy中是否有办法在运行时更改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。我打赌在groovy中有一种方法可以实现这一目标,但由于我是新手,我在这里度过了一段艰难的时光......如果有人能指出我正确的方向,那就太好了。

非常感谢...

1 个答案:

答案 0 :(得分:2)

请注意我上面关于这样做的智慧的评论。也就是说,您可以在运行时使用Groovy的元类别功能替换映射。

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

在Grails中,映射块是一个Groovy closure,因此您可以随时将其替换为任何其他闭包对象。这可能有疯狂的不可预测的Hibernate副作用或根本不做任何事情,因为我不知道何时使用映射闭包在Grails应用程序生命周期中配置Hibernate。