1

我正在使用 Grails,并且我有以下域类:

class Pack {
  String code

  Date publishedDate
  //several other properties (including collections hasMany)....

  def isPublished() {
    return publishedDate != null
  }

  def publish() {
    publishedDate = new Date()    
  }

  def canEdit() {
    return !isPublished()
  }
}

要销售一个包,我首先需要发布它,然后我使用 publish 方法来发布一个包。

发布后,Pack 无法更改(即发布后,Pack 必须是不可变的实例)。

我的问题是:

  • 如何使用 Groovy 在 Immutable 中转换 Mutable 对象?

或者

  • 有没有办法从 Hibernate 中检索不可变实例?

另一种选择是将 canEdit() 方法与 Hibernate 事件(beforeUpdate 和 beforeDelete)结合使用。如果 canEdit() == false 那么我可以在 beforeDelete 或 beforeUpdate 中抛出 RuntimeException。是一个好的解决方案吗?

Obs.:我认为 Ruby 中的 freeze 方法正是我所需要的。(http://rubylearning.com/satishtalim/mutable_and_immutable_objects.html

4

1 回答 1

1

你可以用Pack.read( id )得到

处于只读状态的指定 id 的域类的实例。如果具有指定 id 的行不存在,则返回 null。

http://grails.org/doc/latest/ref/Domain%20Classes/read.html

于 2014-03-04T15:48:17.127 回答