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

时间:2014-01-13 13:24:15

标签: grails gorm

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

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

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

  1. 具有相同架构的镜像表,其中包含版本(双打 域/表的数量)。激活的版本将被复制 到本机域,反之亦然。
  2. 在域类中使用discriminator。一些新列将添加到域中(如state [active,notActive],lastUpdatedBy, lastUpdatedDate ...)
  3. (De-)使用BLOB将实例序列化到特殊域(例如,domain.properties为JSON)
  4. 任何解决方案都有利有弊。实施它的最佳方法是什么?也许有一种更简单的方法。

1 个答案:

答案 0 :(得分:2)

我一直在使用Grails开发一个系统,它充分利用了版本概念(如上所述)。我的方法是你问题中列出的第二个方法。

我创建了两个字段:internalVersion e disabled。每个需要成为Versionable的类都必须实现一个名为Versionable的接口。

我将尝试解释使用版本功能所需的其中一个场景(原谅我的英语)。

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

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

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

clone方法确定该类实现了Versionable接口并执行以下操作:

oldQuote.disabled = true
newQuote.internalVersion = oldQuote.internalVersion + 1

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

我希望你理解我的方法。