我想知道在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中有一种方法可以实现这一目标,但由于我是新手,我在这里度过了一段艰难的时光......如果有人能指出我正确的方向,那就太好了。
非常感谢...
答案 0 :(得分:2)
请注意我上面关于这样做的智慧的评论。也就是说,您可以在运行时使用Groovy的元类别功能替换映射。
Result.metaClass.'static'.mapping = {
collection "myCollection"
database "myDatabase"
}
在Grails中,映射块是一个Groovy closure,因此您可以随时将其替换为任何其他闭包对象。这可能有疯狂的不可预测的Hibernate副作用或根本不做任何事情,因为我不知道何时使用映射闭包在Grails应用程序生命周期中配置Hibernate。