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

Grails:是否可以防止域类实例被持久化?,grails,gorm,Grails,Gorm,我想创建一个域类的(一个)实例(正如预期的那样,它有一个到我的数据库的GORM接口),并且只将其用作传递数据的容器,如地图对象。我想绝对确保我的实例永远不会持久化到数据库中。我担心GORM凭借其所有的聪明,即使没有显式调用save(),也会设法将其保存在幕后的数据库中。在实例化我的对象时,是否有方法指定“不要持久化此”子句?我知道如何防止域类上的持久性,我想要的是仅防止类的特定实例上的持久性 我现在的解决方案是在groovy/src/中创建一个具有相同属性和方法的类,并将其用作我的数据容器,并根

我想创建一个域类的(一个)实例(正如预期的那样,它有一个到我的数据库的GORM接口),并且只将其用作传递数据的容器,如地图对象。我想绝对确保我的实例永远不会持久化到数据库中。我担心GORM凭借其所有的聪明,即使没有显式调用
save()
,也会设法将其保存在幕后的数据库中。在实例化我的对象时,是否有方法指定“不要持久化此”子句?我知道如何防止域类上的持久性,我想要的是仅防止类的特定实例上的持久性

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


当然,您也可以告诉我,我应该停止如此偏执,Grails不会在没有显式保存的情况下持久化域类实例。

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

Grails不会在实例上显式调用
save()
的情况下保存域类的实例。您可以创建一个实例并将其传递,但它不会被持久化。

假设您已经知道如何防止域类上的持久化(表创建)。此外,您还知道w/o explicit.save()对象不会被持久化。 那么,你到底想要什么?是不是像。。即使有人意外地调用obj.save(),它也永远不会持久。 虽然这没有任何意义但根据你的询问

有没有一种方法可以指定一个“donotpersisthis”子句 实例化我的对象

是的,有一种方法:

class MyFishyDomain {
 String pwd
 // properties 
 // constraints

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

}
现在

顺便说一下,如果您想永久禁用创建+更新+删除,但同时又想对域发出查询,那么解决方案是:

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

假设您已经知道如何防止域类上的持久性(表创建)。此外,您还知道w/o explicit.save()对象不会被持久化。 那么,你到底想要什么?是不是像。。即使有人意外地调用obj.save(),它也永远不会持久。 虽然这没有任何意义但根据你的询问

有没有一种方法可以指定一个“donotpersisthis”子句 实例化我的对象

是的,有一种方法:

class MyFishyDomain {
 String pwd
 // properties 
 // constraints

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

}
现在

顺便说一下,如果您想永久禁用创建+更新+删除,但同时又想对域发出查询,那么解决方案是:

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

使用
MyDomain.read()
加载域类的只读实例
read()
要求实例已经被持久化。那么您真正想要的是命令对象而不是域实例。我不知道如何更好地表达我的问题。到目前为止,所有的答案和评论都是断章取义的。请仔细阅读。只需使用扩展您的域类的命令类,它不会被GORM映射,并且您不必编写除MyCommand和Extendes MyDomainClass{}之外的任何代码并完成它。它会带着你所有的约束和一切。这就是你要找的。您想要的是命令对象而不是域对象它们之所以不同是有原因的,您的需要就是这个原因(除其他原因外)。使用
MyDomain.read()
加载域类的只读实例
read()
要求实例已经被持久化。那么您真正想要的是命令对象而不是域实例。我不知道如何更好地表达我的问题。到目前为止,所有的答案和评论都是断章取义的。请仔细阅读。只需使用扩展您的域类的命令类,它不会被GORM映射,并且您不必编写除MyCommand和Extendes MyDomainClass{}之外的任何代码并完成它。它会带着你所有的约束和一切。这就是你要找的。你想要的是一个命令对象而不是域对象,它们的不同是有原因的,你的需要就是这个原因(以及其他原因)。这是正确的。“不需要的保存”的唯一问题是当您检索一个持久化实例(使用
get()
find*()
)并更改一些属性值时,
OpenSessionInViewInterceptor
即使没有
save()
也会持久化更改。但这不应该与自动保存一个新实例相混淆——它不会发生。这是正确的。“不需要的保存”的唯一问题是当您检索一个持久化实例(使用
get()
find*()
)并更改一些属性值时,
OpenSessionInViewInterceptor
即使没有
save()
也会持久化更改。但这不应该与自动保存一个新实例相混淆——它不会发生。这是一个非常有趣和聪明的方法。谢谢你的回答。非常有趣和聪明的方法。谢谢你的回答。