【问题标题】:Hibernate Envers undo休眠环境撤消
【发布时间】:2015-09-08 08:22:59
【问题描述】:

我的应用程序运行良好。但现在客户想要撤消更改。 已经进行的数据库提交必须撤消。

因此我设置了 envers 并启用了两个必要的属性

    <property name="org.hibernate.envers.track_entities_changed_in_revision">true</property>
    <property name="org.hibernate.envers.global_with_modified_flag">true</property>

审计表是自动创建和填充的。 现在我的侦听器 (CTRL+Z) 执行以下片段

public void run() {

    if (SystemDatabaseManager.isInitialized()) {

        if (AppHelper.showQuestion(Display.getCurrent().getActiveShell(), "undo?") == SWT.YES) {

            Session session = null;

            try {

                session = SystemDatabaseManager.getCurrentSession();

                AuditReader reader = AuditReaderFactory.get(session);

                final Number revision = reader.getRevisionNumberForDate(new Date(Long.MAX_VALUE));

                List<Object> test = reader.getCrossTypeRevisionChangesReader().findEntities(revision);

                session.beginTransaction();
                for(Object object: test) {

                    session.merge(object);

                }
                SystemDatabaseManager.commit(session);

            } catch (Exception e) {
                SystemDatabaseManager.rollback(session);
            }

        }

    }

}

现在的问题是合并旧的对象状态抛出异常

"删除的对象应该重新保存..."

我知道这个异常及其代表什么,但我不知道如何以这种方式解决它。

最大的问题是不仅原始字段在发生变化。关系也发生了变化。

我的问题有什么解决办法吗?

【问题讨论】:

    标签: hibernate hibernate-envers


    【解决方案1】:

    最简单的方法是使用 SQL。审计表在结构上与普通表相同,除了一些额外的数据(版本、日期、时间等)。只需用审计表中的记录覆盖普通表中的记录就可以了。所有关系和相关实体在同一个版本中都会有对应的记录,所以也要复制。

    客户想要撤消更改时的意思是什么?

    • 他们是否希望审计表中的记录包含以前的数据,以便还保留撤消的历史记录?这变得更加棘手,因为您必须在审计表中插入一条新记录并增加全局版本号(在修订表中插入一行)。

    • 他们是否想要系统回退到之前的状态(删除以后的审计记录)?现在您必须从审计表和修订表中删除一些记录。

    最后一个解决方案是仅在删除给定版本号之后的所有版本时保存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-29
      • 2016-05-27
      • 2016-03-31
      • 1970-01-01
      • 1970-01-01
      • 2012-12-06
      • 2011-10-10
      • 1970-01-01
      相关资源
      最近更新 更多