簡體   English   中英

在Java中保留表格的歷史記錄

[英]keeping the history of table in java

我需要Java中的示例程序來保留表的歷史記錄(如果用戶在該表上插入,更新和刪除了該表)。 有人可以幫忙嗎?

提前致謝。

如果您使用的是Hibernate ,則可以使用Envers解決此問題。

您有兩種選擇:

  1. 讓數據庫使用觸發器自動處理此問題。 我不知道您正在使用哪個數據庫,但是它們都支持可用於此的觸發器。
  2. 在您的程序中編寫代碼,以在插入,更新和刪除用戶時執行類似的操作。

就個人而言,我更喜歡第一種選擇。 它可能需要較少的維護。 您可能在多個地方更新用戶,所有這些地方都需要代碼來更新另一個表。 此外,在數據庫中,您還有更多用於指定所需值和完整性約束的選項。

觸發器是不建議使用的,當我將審計數據存儲在文件中時,否則我沒有使用數據庫...我的建議是創建表“ AUDIT”並在Servlet的幫助下編寫Java代碼,並將數據存儲在文件或DB或其他文件中DB也...

好吧,我們通常有自己的歷史記錄表,(大多數情況下)看起來像原始表。 由於大多數表已經具有創建日期,修改日期和相應的用戶,因此我們要做的就是將創建日期為now()的數據集從實時表復制到歷史表。

我們正在使用Hibernate,因此可以在攔截器中完成,但是可能還有其他選項,例如某些數據庫觸發器執行腳本等。

這是Java問題嗎?

這應該在數據庫部分中移動。

您需要創建一個歷史表。 然后在原始表上創建數據庫觸發器,以便“在插入或更新或刪除表中的每一行之前創建或替換觸發器...。”

我認為可以通過在sql-server中創建觸發器來實現。 您可以按以下方式創建觸發器:

句法:

創建觸發器觸發器名稱{ 之后} {插入| 更新| DELETE} ON table_name每行觸發的語句

您將必須創建2個觸發器,一個在執行操作之前創建,而另一個在執行操作之后創建。 否則它也可以通過代碼來實現,但是在批處理過程中,代碼要處理起來會有些繁瑣。

您應該嘗試使用觸發器。 您可以有一個單獨的表(需要維護其歷史記錄的表的精確副本)。

然后,在主表上進行每次插入/更新/刪除操作后,將通過觸發器來更新該表。

然后,您可以編寫Java代碼以從第二個歷史記錄表中獲取這些更改。

我認為您可以使用基礎數據庫的重做日志來跟蹤執行的操作。 參加該計划有什么特別的理由嗎?

您可以嘗試從表中創建一個對象列表(假設您有數據對象)。 哪一個可以讓您遍歷列表並與表中的當前數據進行比較? 然后,您將能夠查看是否發生了任何更改。

您甚至可以使用包含枚舉器的對象創建另一個列表,該枚舉器為您提供操作(刪除,更新,創建)以及新數據。

以前沒有做過,只是一個想法。

就像提到的@Ashish一樣,觸發器可用於插入單獨的表中-通常稱為Audit-Trail表Audit Log表

以下是此類審計跟蹤表中通常定義的列:“操作”(插入,更新,刪除),表名(插入/刪除/更新表的表),鍵( 根據需要該表的主鍵),時間戳(執行此操作的時間)

最好在整個事務完成后審核日志。 如果不是這樣,則在將異常傳遞回代碼端的情況下,將需要單獨調用更新審核表。 希望這可以幫助。

如果您在談論數據庫表,則可以在數據庫中使用觸發器,也可以在應用程序中添加一些額外的代碼-可能使用方面。 如果您使用的是JPA,則可以使用實體偵聽器或執行一些額外的邏輯,以向DAO對象添加某些方面,並將特定方面應用於所有對需要維持歷史數據的實體執行CRUD的DAO。 如果您的DAO對象是無狀態Bean,則可以使用Interceptor來實現在其他情況下使用Java代理功能,cglib或其他可以為您提供方面功能的lib。 如果您使用的是Spring而不是EJB,則可以在應用程序上下文配置文件中建議DAO。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM