2013-05-09 53 views
2

我有兩個實體列表:一個是數據庫中行的當前狀態,另一個是對列表所做的更改。如何審覈已刪除,添加的行以及對實體所做的更改?我的審計表由所有實體使用。我將如何審覈對JPA實體列表的更改?

Entity listeners and Callback methods看起來像是一個完美的搭配,直到您注意到這樣的句子:回調方法不能調用EntityManager或Query方法!因爲有這個限制,我可以收集審計,但我不能堅持他們對數據庫:(

我的解決方案是一個複雜的算法來發現審計。

If the entity is in the change list and has no key, it's an add 

If the entity is in the db but not the changes list, it's a delete 

If the entity is in both list, recursively compare their fields to find differences to audit (if any) 

我收集這些和我把它們插入到數據庫中,我把這個變化列表合併了,但我討厭這個事實我正在寫這個,看起來JPA應該可以爲我做這個邏輯。我們提出的解決方案是使用一個將審計過帳到JM的實體監聽器S隊列。隊列然後將審計插入到數據庫中。但我不喜歡這個解決方案,因爲我認爲設置JMS隊列是一件痛苦的事情。這是目前我們最好的解決方案。


我使用的EclipseLink(理想情況下,這是不相關),並發現看起來有用,但JMS隊列是比他們更好的解決這兩個東西:

回答

0

由於您能夠收集審計信息,因此EntityListener看起來很不錯。

您是否嘗試過在持續更改的持續不同的事務中保存信息?也許可以獲得對無狀態EJB的引用(假設您正在使用EJB)並使用標記爲@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)的方法。通過這種方式,在審計事務完成時,保持原始更改的事務處於暫停狀態。請注意,您將無法訪問此單獨審計事務中更新的信息,因爲原始信息尚未提交。

+0

如果我把它放在REQUIRES_NEW中,它仍然會使用它所說的被禁止的實體管理器。 – 2013-05-10 22:18:58

+0

您將在另一個事務中使用EntityManager的不同實例,這會創建與更改所在的持久性上下文不同的持久性上下文。我不確定註釋是因爲當前持久化上下文中的某種問題還是禁止任何類型的數據庫交互。 – German 2013-05-10 22:25:02