当前位置: 首页 > 知识库问答 >
问题:

Hibernate Envers -添加历史数据

舒浩邈
2023-03-14

有没有办法将修订版直接添加到_AUD表中作为历史修订版?

据我所知,当实体被持久化时,envers会在_AUD表中创建修订记录,并将当前记录保留在实体表中。假设我想添加历史修订而不影响实体表,这可能吗?

例如,我有一个人实体

PERSON
ID | NAME 
1  | SMITH

PERSON_AUD
ID | REV | REVTYPE | NAME
1  | 1   | 0       | SMITH

我想在PERSON_AUD中添加以下内容,而不修改PERSON表,因为SMITH是当前姓名。

PERSON_AUD
ID | REV | REVTYPE | NAME
1  | 1   | 0       | SMITH
1  | 2   | 2       | JONES

共有3个答案

叶阳
2023-03-14

您似乎忘记或没有意识到修订号是全局的;它在一个单独的表中进行跟踪,在默认设置中称为REVINFO。修订号的每个条目都附有时间戳。插入不是自然创建的历史数据是完全错误的(甚至可能成为严重的情况,具体取决于环境)。

如果您仍然想这样做,可以使用本机SQL来执行此操作,方法是首先在REVINFO中创建修订条目,然后在审计表中使用它。这是错误的。

呼延承平
2023-03-14

我的背景是C#,但是因为Java的框架更强大(至少我是这样认为的),我确信你会找到相关的方法。

1)将实体重新附加到会话将创建一个新的修订版:

private void Reattach(Person person)
{
    _sessionContainer.Session.Transaction.Begin();
    _sessionContainer.Session.Evict(person);
    _sessionContainer.Session.Update(person);
    _sessionContainer.Session.Flush();
    _sessionContainer.Session.Transaction.Commit();
}

2) 如果要操纵审核条目,则需要附加侦听器(在本例中为预更新):

configuration.AppendListeners(ListenerType.PreUpdate, new object[] { new PreUpdateListener() });

实现正在发挥魔力的地方:

public class PreUpdateListener : IPreUpdateEventListener
{
    public bool OnPreUpdate(PreUpdateEvent ev)
    {
        var person = ev.Entity as Person;
        if (person != null)
        {
            person.Name = "Jones";
        }

        return true;
    }
}

请让我知道这种方法是否适合您。

逄俊力
2023-03-14

恐怕这在当前的Envers API中是不可能的。

 类似资料:
  • 任何push到open-falcon中的数据,事后都可以通过api组件提供的restAPI,来查询得到。 具体请参考API文档

  • 历史 本书改编和包含了以下两本书的部分章节,这两本书均以GNU Free Documentation License发布。 How To Think Like A Computer Scientist: Learning with C++ 作者Allen B. Downey。原书由Green Tea Press发行,可以从http://www.greenteapress.com/下载到。 Prog

  • 大部分1980年前的 Unix 竞争者都被拴到单个硬件平台上,随着这个硬件的消亡而消亡。为什么 VMS 可以坚持这么久?值得我们作为案例研究一个原因是:VMS 成功地从最初的 VAX 硬件移植到了 Alpha 处理器(2003年正从 Alpha 移植到 Itanium 上)。MacOS 也在1980年代后期成功完成了从摩托罗拉68000到 PowerPC 芯片的迁跃。微软的 Windows 处在计

  • 同生活中的许多伟大事物一样,Git 诞生于一个极富纷争大举创新的年代。 Linux 内核开源项目有着为数众广的参与者。 绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2002年间)。 到 2002 年,整个项目组开始启用一个专有的分布式版本控制系统 BitKeeper 来管理和维护代码。 到了 2005 年,开发 BitKeeper 的商业公司同 Linux

  • 任何push到open-falcon中的数据,事后都可以通过api组件提供的restAPI,来查询得到。 具体请参考API文档

  • Cassandra最初由Facebook的两名印度人Avinash Lakshman(亚马逊Dynamo的作者之一)和Prashant Malik共同开发。 它被开发用于为Facebook收件箱搜索功能提供支持。 以下是Cassandra历史上最重要的几个事件: Cassandra在Facebook由Avinash Lakshman和Prashant Malik开发。 它是为Facebook收件箱