2014-10-09 62 views
0

有沒有一種方法可以將歷史版本直接添加到_AUD表中?休眠Envers - 添加歷史數據

據我所知,當一個實體持久化時,envers在_AUD表中創建一個修訂記錄,並將當前記錄保留在實體表中。假設我想添加歷史版本而不影響實體表,這可能嗎?

例如,我有一個Person實體

PERSON 
ID | NAME 
1 | SMITH 

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

我想補充的PERSON_AUD以下,而無需修改PERSON表史密斯是當前名稱。

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

第二次修訂版本Revtype應爲1,以進行修改。 – 2014-10-09 18:03:54

回答

0

恐怕現在的Envers API是不可能的。

+0

嗨亞當 - 我一直在尋找ValidityAuditStrategy,並可以看到這個類負責爲REVEND_TSTMP列創建新版本時提供值。我可以擴展這個類來爲其他列從前一版本更新的值提供值,例如REVEND_TSTMP。 能夠有擴展點來實現這一點很好,你認爲這樣的事情會在未來的版本中出現嗎? – 2014-10-11 22:33:33

+0

那麼VAS也做了其他一些事情,主要是關注實際編寫新的修訂實體條目。如果您想要添加這樣的功能,創建AuditWriter可能會更有意義,但我不確定是否有更多人會對此感興趣。 – adamw 2014-10-13 07:10:15

+0

對於我們當前的實現來說,有一個非常有用的特性,可以讓Listener像RevisionListner一樣被解僱,但是其中提供了前一個revinfo的Listener。這會給我們一個擴展點來更新以前的revinfo。 – 2014-10-14 19:43:37

0

我的背景是C#,但由於Java的框架更強大(至少我認爲這一點),我相信你會找到相關的方法。

1)重新粘上實體會話將創建一個新版本:如果你想manipiulate你需要附加一個監聽器(在這種情況下更新前)的審覈條目

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

請讓我ķ現在如果這種方法適合你。

+0

Hi Rico - 我實際上是用Spring JPA來評估Hibernate + Envers,並且不想在評估過程中從早期的開箱即用功能中脫穎而出。在做了一些小小的研究之後,我認爲只需要使用Jdbc編寫sql並插入審計記錄就可以更輕鬆地完成任務。 – 2014-10-11 22:27:43

-1

您似乎忘記或不知道修訂號碼是全球性的;它在一個單獨的表格中進行跟蹤,該表格在默認設置中被稱爲REVINFO。修訂版本號的每個條目也附帶一個時間戳。這是完全錯誤的(甚至可能成爲嚴重的情況取決於環境)插入歷史數據,而這些數據並非自然產生。

如果您仍想這樣做,您可以使用本機SQL來執行此操作,方法是先在REVINFO中創建一個修訂條目,然後在您的審計表中使用該條目。這是錯誤的。