Grails:是否可以阻止域类实例被持久化?

时间:2015-03-06 21:57:11

标签: grails gorm

我想创建一个(一个)实例的一个Domain类(正如预期的那样,它有一个GORM接口到我的数据库)并且只用它作为一个容器传递数据,就像Map对象一样。我想让完全确定我的实例 永远不会在数据库中保留。我担心GORM会以某种方式聪明地设法将它保存在场景后面的数据库中,即使没有明确调用save()。有没有办法指定一个"不要坚持这个" 实例化我的对象时的子句?我知道如何防止域类的持久性,我想要的是阻止对类的特定实例的持久性。

我现在的解决方案是在groovy/src/中创建一个带有相同属性和方法的类,并将其用作我的数据容器,并根据需要进行类型转换。感觉不对,干不好,黑客。

当然你也可以告诉我,我应该停止这么偏执,并且Grails永远不会在没有明确保存的情况下坚持域类实例

2 个答案:

答案 0 :(得分:5)

假设您已经知道如何防止域类的持久性(表创建)。此外,您还知道没有显式的.save()对象不会被持久化。 那么,你究竟想要什么?是不是......即使有人不小心打电话给obj.save(),它也永远不会存在。 虽然这没有任何意义,但根据您的询问,

  

有没有办法指定"不要坚持这个"条款时   实例化我的对象?

是的,有办法:

class MyFishyDomain {
 String pwd
 // properties 
 // constraints

   def beforeInsert() {
      if (!this.pwd.equals("drago")) return false
    }
    def beforeUpdate () {
      if (!this.pwd.equals("drago")) return false
    }

}

现在..

new MyFishyDomain(pwd:"drago").save()  // success
new MyFishyDomain(pwd:"rambo").save()  // fail

顺便说一句,如果你想永久禁用Create + Update + Delete但是同时想要针对域发出查询,那么解决方案就是:

static mapping = {
   cache usage: "read-only"
}
def beforeInsert() {
   return false
}

答案 1 :(得分:4)

如果没有在实例上显式调用save(),Grails将不会保存您的域类的实例。你可以创建一个实例并传递它,它不会被持久化。