【问题标题】:Grails: Is it possible to prevent a domain class instance from being persisted?Grails:是否可以防止域类实例被持久化?
【发布时间】:2015-03-06 21:57:10
【问题描述】:

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

我现在的解决方案是在groovy/src/ 中创建一个具有相同属性和方法的类,并将其用作我的数据容器,并根据需要进行类型转换。感觉不对,DRY 失败,而且很老套。

当然,你也可以告诉我,我不应该再这么偏执了,Grails 永远不会在没有明确保存的情况下持久化域类instance

【问题讨论】:

  • 使用MyDomain.read()加载域类grails.github.io/grails-doc/3.0.x/ref/Domain%20Classes/…的只读实例
  • read() 要求已经持久化实例。
  • 那么你真正想要的是一个Command对象而不是一个域实例。
  • 我不知道如何更好地表达我的问题。到目前为止,所有答案和 cmets 都已脱离上下文。请仔细阅读。
  • 只需使用扩展您的 Domain 类的 Command 类,它不会被 GORM 映射,您不必编写除 class MyCommand extends MyDomainClass {} 之外的任何代码并完成它。它将继承你所有的限制和一切。这就是你要找的。你想要一个 command object 而不是 domain object 它们不同是有原因的,你需要的是那个原因(等等)。

标签: grails grails-orm


【解决方案1】:

假设您已经知道如何防止域类的持久性(表创建)。此外,您还知道没有显式的 .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
}

【讨论】:

  • 非常有趣和聪明的方法。谢谢你的回答。
【解决方案2】:

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

【讨论】:

  • 这是正确的。 “不需要的保存”的唯一问题是当您检索持久化实例(使用 get()find*())并更改一些属性值时,OpenSessionInViewInterceptor 即使 没有 @987654325 也会保留更改@。但这不应与自动保存新实例相混淆——它不会发生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-11
  • 2010-12-20
  • 2020-02-14
  • 2017-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多