有没有办法将修订版直接添加到_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
答案 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中创建修订条目然后在审计表中使用它来实现。这是错的。