2016-12-08 37 views
0

我正在使用Hibernate Envers作爲我的修訂歷史記錄。 這是我的表設置:如何在使用envers時保存其他屬性

CREATE TABLE EPIC (
epicid SERIAL NOT NULL, 
accountid BIGINT NOT NULL, 
description TEXT NOT NULL UNIQUE, 
epicowner TEXT NOT NULL, 
PRIMARY KEY(epicid) 
); 

CREATE TABLE EPIC_AUD(
epicid BIGINT NOT NULL , 
REV BIGINT NOT NULL, 
accountid BIGINT, 
description TEXT, 
epicowner TEXT, 
REVTYPE BIGINT, 
PRIMARY KEY(epicid,REV) 
); 

目前,當我做出改變它不僅節省了複合主鍵的值和修改類型。既然我也想記錄刪除某個實體的用戶,我也想保存這個值。這是我用來刪除實體的代碼。

@Override 
public boolean deleteItem(Epic epicFromFrontend) { 
    transactionBegin(); 
    Epic epicToRemove = getEntityManager().find(Epic.class, epicFromFrontend.getEpicid()); 
    epicToRemove.setAccountid(epicFromFrontend.getAccountid()); 
    getEntityManager().remove(epicToRemove); 
    return transactionEnd(); 
} 

其實我有2個問題:

  1. 如何保存ACCOUNTID太
  2. 或者是它也許更聰明,更好地保存所有數據。所以我刪除後在EPIC_AUD表中沒有空字段。
+0

像http://docs.jboss.org/hibernate/core/4.0/devguide/en-US/html/ch15.html#d0e5519這樣的東西可能會幫助你達到你想要的東西,如果我正確理解你的話。 – N4zroth

+0

感謝您的回覆,但那是我已經找到的。不過,我不是那麼喜歡這個,因爲那意味着我只需要做一些簡單的事情就可以創建很多代碼。如果沒有像「@Auditthisattribute」或@Auditthisfield –

+0

任何註釋你老老實實找什麼是跟蹤在RevisionEntity水平相關的東西,並在域實體級別不跟蹤值我不知道。這使您可以輕鬆地跟蹤刪除用戶,而無需任何侵入性代碼來操作您的域模型。 – Naros

回答

0

可以attribue record_active布爾添加到您的表史詩,以及表當然epic_aud。 當record_activefalse它表示記錄已被「刪除」。 並且從不刪除任何物理記錄 - 這實際上是一種很好的做法:)

+0

多數民衆贊成我也有記住,但然後我的屬性在表epic_aud仍然有空值。 –

+0

爲什麼?當某些用戶想要刪除記錄時,您的應用程序將** record_status **設置爲* false *和** account_id **轉換爲該用戶的* id *。 Envers使用record_status和account_id作爲當前值創建記錄的副本。沒有任何東西丟失,你只需要使用record_status過濾記錄來忽略「已刪除」的項目。 –

+0

也許我很愚蠢的理解你,但表史詩中的阿爾非PK值並沒有保存在表epic_aud中。例如如果我刪除一行,它只是填充屬性:epicid,rev和revtype。如果我要添加一個名爲record_status的屬性,並將其設置爲false。假值不會記錄顯示在epic_aud –

1

在插入,更新或刪除域實體期間,捕獲各種附加的特定審計信息是很常見的做法。

如Marcin H所建議的那樣,一種簡單卻不入侵的方式是將該狀態存儲在與實體相同的結構中。雖然這種方法可行,但這種方法存在幾個問題。

  1. 混合的擔憂
    這裏的問題是,歷史相關的信息現在被存儲沿着側右域特定的數據。就像安全一樣,審計是一個橫切關注的問題,因此在數據結構方面應該以同樣的方式處理。此外,由於架構中的多個審計行受到操縱,因此您經常在多個表中表示相同的用戶,時間戳記等,這會導致不必要的架構和表擴張。對於數據刪除

  2. 不必要的字段/操作當存儲此刀魂對實體本身的領域,它引入了一套有趣的要求爲實體刪除過程的一部分。如果您希望Envers跟蹤該移除用戶,那麼您必須在移除之前使用該用戶執行實體更新,或者引入一個附加列以跟蹤是否軟刪除一行,如Marcin H.所建議的。

    此方法意味着即使刪除已被刪除,表格也會無限增長。這可能會對長期查詢性能和其他各種問題產生負面影響。理想情況下,如果數據不再與歷史目的相關,並且不存在必須維護的FK關係,則最好將該行從非審計表中移除。

不是上述情況,我建議使用這種策略,我貼here,描述瞭如何利用與Envers定製RevisionEntity數據結構,使您能夠跟蹤多列數據是有關當前事務操作。

這種方法具有以下額外的好處:

  1. 沒有Envers(審計)具體在你的DAO方法散落代碼。您的DAO方法繼續只關注特定於域的操作,因爲它應該是。
  2. 在情況下的多個實體被單一交易中的操作,你現在只捕獲各種審計屬性每一次交易(又名每一次修訂)。這意味着如果用戶添加,刪除和更新各種行,他們將被標記一次。
  3. 現在,您可以輕鬆地跟蹤,因爲審計屬性保持在RevisionEntity,這將用於刪除生成誰執行的行刪除的人。不需要特殊的操作或字段來處理這種情況。此外,您可以啓用刪除實體快照,然後訪問(1)誰刪除了該行,以及(2)刪除行之前該行的樣子。
+0

謝謝你的回覆,我會認爲我會試一試! –

相關問題