根据某些条件取消/阻止域对象的保存?

时间:2011-11-30 10:12:52

标签: grails gorm

我需要根据某些属性阻止或取消域对象的保存。 这可以在约束中完成吗?

实施例: “订单”域对象的状态为“已开票”,则订单不应再次更新..

有关如何解决此问题的任何建议吗?

1 个答案:

答案 0 :(得分:2)

我认为没有理由不能简单地使用约束(如你所建议的那样)。像这样的东西应该这样做

class Order {

  String state

  static constraints = {

    state(validator: {stateValue, self ->

      // only check state if this object has already been saved
      if (self.id && stateValue == 'invoiced') {
        return false
      }
    })
  }
}

如果由于某种原因你不能使用约束,这里有几个替代建议:

元编程

使用Groovy的方法拦截功能拦截对save()的调用。如果订单没有开票状态,您的拦截器应该只将调用转发给截获的save()

Programming Groovy书籍

中有一些很好的例子

GORM活动

GORM提供了在持久对象生命周期中触发的许多events。在beforeUpdatebeforeValidate事件中可能有可能阻止更新对象(我想抛出异常会起作用)