Hibernate Envers - 添加历史数据

时间:2014-10-09 00:06:52

标签: hibernate-envers

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

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

例如,我有一个Person实体

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 个答案:

答案 0 :(得分:0)

我担心目前的Envers API无法实现。

答案 1 :(得分:0)

我的背景是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)如果你想操纵审计条目,你需要附加一个监听器(在这种情况下是preupdate):

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;
    }
}

如果这种方法适合您,请告诉我。

答案 2 :(得分:-1)

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

如果您仍想这样做,可以使用本机SQL通过首先在REVINFO中创建修订条目然后在审计表中使用它来实现。这是错的。