如何管理 Grails 中的对象修订?

Posted

技术标签:

【中文标题】如何管理 Grails 中的对象修订?【英文标题】:How to manage object revisions in Grails? 【发布时间】:2011-04-03 15:46:21 【问题描述】:

我需要在我的 grails 网络应用程序中为文章实施修订系统。在搜索 grails 论坛、***、grails 插件和谷歌搜索互联网后,我最终得到了 3 个选项:

选项 1 - 使用 grails Envers 插件(请参阅 http://code.google.com/p/grails-envers-plugin/)。有人成功使用过吗?或者在没有插件的情况下使用Envers(参见here),但我怎样才能让它与GORM一起工作?

选项 2 - 使用 Gvers 插件 我在这里找到了:https://github.com/ziftytodd/gvers。没听说有人用过,请问有谁用过成功的吗?

选项 3 - 内置机制Weceem 为 Weceem CMS 的任何内容创建了版本控制系统。我可以从这个伟大应用程序的代码逻辑和设计中汲取灵感,但这似乎有点矫枉过正,我不太喜欢使用非标准解决方案。

所以我的问题,你建议我做什么?您曾经使用过这些选项中的任何一个吗?

非常感谢您的见解。

【问题讨论】:

@Pascal Thx 但我更希望得到一个不错的答案:) 【参考方案1】:

我在 Hibernate 项目中使用了 Envers,它运行良好。 GORM是基于Hibernate的,所以我认为没有问题。

首先,您需要确定您需要什么样的版本控制?您是否需要回滚对象图更改或需要照顾一些字段?有时做一些小的本地实现比注入庞大的库更好。

如果您需要修改对象图,Envers 是一个不错的选择。 如果你需要修改一个领域,DIY :)

【讨论】:

【参考方案2】:

由于我在提出问题后的几天内没有得到任何答案,因此我们已开始调查所有选项并得出以下结果/结论:

    Envers 插件:虽然 Envers 是处理对象修订和使用 Hibernate 进行审计的一种行之有效的方法(正如 Vadeg 指出的那样),但没有这样的现成的grails 的货架解决方案。 Envers 插件完全没用,而且是一个死气沉沉的项目。因此,仍然无法直接将 Envers 与 GORM 一起使用,但我相信 Envers 插件(可能是 grail 2.0 的一部分?)有空间,因为 Envers 现在是 Hibernate 核心模块的组成部分。但是,我们没有时间实施这样的解决方案(当您有足够的时间和资源时,这是迄今为止最好的解决方案)......所以我们放弃了它。

    Gvers 插件:令人惊讶的是,即使在 GRAILS 世界中似乎没有人使用它(即使是拥有无效电子邮件的插件创建者! )。使用它似乎有风险,但如果您的要求很低(例如基本版本控制系统),您应该使用它。..

    内置系统:除非您正在构建一个具有非常特殊需求的 CMS 系统,或者相反的一些非常简单的东西,否则我不会在任何其他情况下使用它。 Weceem 实现得非常好,有大量的 CMS 内容修订示例,但即便如此,遗憾的是他们没有使用 Envers。无需重新发明***……更好地改进现有的法拉利,不是吗?

    VCS 系统:一位朋友建议我使用专门为此类任务构建的现有解决方案:当然是版本控制系统!实际上,GIT 似乎是完美的候选者:快速、可靠、几乎免费的存储库可供您使用。其实这是完美的解决方案。我唯一的问题:好吧,我不知道如何使用 Git(更不用说它的 API),而且我也没有时间。

底线

我当然会使用 Gvers,但如果您熟悉 Git 或者如果您对 GORMHibernate 感到满意strong>,去构建一个 grail 插件(基于 GitEnvers

【讨论】:

非常有趣!感谢您发布您的发现!我喜欢 GIT,但我非常不确定在这种情况下这是否是一个好主意。 Fabien,你的朋友推荐了一个工具,它是为一种非常不同类型的任务而设计的:版本控制代码(与数据库数据相对)。这两个领域没有任何共同点,因此您最好专注于其他选项(据我所知,envers 看起来很有希望)。 @Tomislav 我很确定我的朋友已经使用 GIT 实现了一个数据库版本控制系统。版本控制代码与文本有什么区别? 问题是它是否应该(而不是“可以”)完成。您需要对使用 Web 应用程序管理的文章进行版本控制。这意味着能够确定版本的数量、检索单个版本等。如果您将数据保存在数据库中,则您已经有一个 DAL 可以与数据库进行通信。引入 SCM 来对数据进行版本控制会引入并行 DAL,并要求您编写大量骇人听闻的代码(委婉地说),这些代码会转储数据库、向/从 git 提交/检索……等等。正确的方法是使用相同的 DAL 处理相同类型的数据。【参考方案3】:

Lucas Ward's plugin 有效。通过 Grails 1.3.7 确认 重要的是确保实体更新在事务中,因为环境依赖于它。 只是提醒 Grails 控制器默认情况下不是事务性的。

【讨论】:

以上是关于如何管理 Grails 中的对象修订?的主要内容,如果未能解决你的问题,请参考以下文章

flash 对象映射如何在 grails 框架中工作

Grails 命令对象:如何将 request.JSON 加载到其中?

在 grails-app 之外的 Grails 类中注入日志对象

如何列出要注入 grails 的可用对象?

没有管理器的 Grails Spring Security Ldap

如何在 Grails 中的数据库中持久化闭包?