在Grails中对要批准的域实例进行版本控制

Wal*_*mar 13 grails grails-orm

我正在寻找扩展Grails CRUD生成功能的最佳方法.它应该是一个Grails插件,它为以下功能提供了额外的生成器:

  • 对于历史记录,应保存对扩展域实例的任何更改(作为其版本)
  • 只有一个版本的实例可以处于活动状态
  • 用户应该能够激活不是由他创建的实例版本(当前活动的实例应该被停用)(4眼原则)
  • 差异视图很不错

Grails开箱即用的脚本应该尽可能小.到目前为止,我确定了3个实施设计策略:

  1. 具有相同模式的镜像表,其中包含版本(将域/表的数量加倍).激活的版本将复制到本机域,反之亦然.
  2. 在域类中使用鉴别器.一些新列将添加到域中(如state [active,notActive],lastUpdatedBy,lastUpdatedDate ...)
  3. (De-)使用BLOB将实例序列化到特殊域(例如,domain.properties为JSON)

任何解决方案都有利有弊.实施它的最佳方法是什么?也许有一种更简单的方法.

can*_*oni 2

我一直在 Grails 中开发一个系统,该系统充分利用了版本概念(正如您上面提到的)。我的方法是您问题中列出的第二种方法。

我创建了两个字段:internalVersion e 已禁用。每个需要版本化的类都必须实现一个名为 Versionable 的接口。

我将尝试在这里解释使用版本功能所必需的场景之一(请原谅我的英语)。

使用这个概念的系统是一个商业系统,其中有一个名为 Quote 的类。

每个报价单可以有一个或多个版本,其中只有最后一个版本有效。每个报价及其版本都是根据与特定客户的谈判生成的。这样,客户向我们询问报价,如果由于某种原因他不喜欢价格(例如),我们可以生成带有一定折扣的新版本。每个报价都有一个唯一的代码,后跟当前版本,例如:QT-000022/0(第一个版本)、QT-000022/1(第二个版本)。

为了生成新版本,我使用了一种克隆当前对象的方法(使用一种完整且深入的另存为)。我将所有内容(属性和集合)复制到一个新对象。

clone 方法标识该类实现 Versionable 接口并执行以下操作:

oldQuote.disabled = true
newQuote.internalVersion = oldQuote.internalVersion + 1
Run Code Online (Sandbox Code Playgroud)

这样就可以确保只启用一个版本。

我希望你能理解我的做法。