我有兩個實體列表:一個是數據庫中行的當前狀態,另一個是對列表所做的更改。如何審覈已刪除,添加的行以及對實體所做的更改?我的審計表由所有實體使用。我將如何審覈對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隊列是比他們更好的解決這兩個東西:
- http://wiki.eclipse.org/EclipseLink/FAQ/JPA#How_to_access_what_changed_in_an_object_or_transaction.3F這看起來真的很難使用。您可以通過字符串搜索字段。所以如果我重構我的實體並忘記更新它,它會引發一個運行時錯誤。
- http://wiki.eclipse.org/EclipseLink/Examples/JPA/History這與我們目前審覈的方式不一致。它預計有一個特殊的
entity_history
表。
如果我把它放在REQUIRES_NEW中,它仍然會使用它所說的被禁止的實體管理器。 – 2013-05-10 22:18:58
您將在另一個事務中使用EntityManager的不同實例,這會創建與更改所在的持久性上下文不同的持久性上下文。我不確定註釋是因爲當前持久化上下文中的某種問題還是禁止任何類型的數據庫交互。 – German 2013-05-10 22:25:02