簡體   English   中英

通過 Envers Hibernate 創建/更改表的日志

[英]Log Creation/Altering of Tables By Envers Hibernate

1) 當有一個用@Audited 注釋的新實體或列時,Hibernate Envers 何時創建或更改架構中的審計表?

2) 有沒有辦法記錄在添加新的審計表或列時調用的 mysql 命令?

當存在使用 @Audited 注釋的新實體或列時,Hibernate Envers 何時創建或更改架構中的審計表?

從技術上講 Hibernate Envers 根本不這樣做,整個步驟由 Hibernate ORM 正確處理。 在 Hibernate ORM 的引導過程中,會發生以下步驟:

  1. ORM 收集所有實體映射,定義在 XML 和注釋類中。 ORM 采用所有這些表示並構建我們稱之為實體的引導模型表示。
  2. Envers 實現了一個特殊的鈎子,ORM 在准備好引導模型之后但在運行時 model 構建之前立即調用該鈎子,ORM 此后使用該鈎子。 這個鈎子允許 Envers 結合帶注釋的 java 類解析引導模型,並為 ORM 創建額外的實體映射,以補充內置的內容 (1)。 這些映射當前提供給 ORM 具有額外的 Hibernate HBM XML 映射。
  3. 如果鈎子產生任何額外的 HBM XML 映射,Hibernate ORM 也會通過將它們轉換為引導模型表示來直接集成它們。
  4. 在 Hibernate ORM 將此引導模型轉換為運行時模型表示之前,ORM 構建映射的數據庫表示。 此時,數據庫 model 在架構遷移(如果啟用)期間用於驗證/更新/創建架構以匹配數據庫 model 表示。

有沒有辦法記錄在添加新的審計表或列時調用的 mysql 命令?

有幾種方法可以做到這一點,當然有些方法比其他方法更容易。

例如,您可以啟用 Hibernate SQL 日志記錄,使用您的日志記錄 API 將這些條目配置為寫入一個特殊的命名文件,然后在指定的時間間隔發送這些日志以進行后處理。

您還可以考慮使用更獨立的東西,例如 Debezium,它能夠在事務/歸檔/oplog/binlog 級別監視數據庫更改,並且某些連接器公開了專門存儲 DDL 更改的 Kafka 主題。

  1. Hibernate-envers 正在使用攔截器將更改插入到試聽表中。 它們在事務提交到數據庫之前被調用。

  2. 這個問題有點不清楚,如果你說 mysql-commands 我猜你的意思是像CREATE TABLECREATE COLUMN這樣的更新查詢。 默認情況下,enver 會報告針對模式的違規行為。 我可以想象 - 如果您也將試聽表公開為休眠實體 - hbm2ddl 可能會創建那些創建表和創建列更新查詢。

畢竟我建議使用單一來源的真實版本概念(SSOVOT)和故障快速(FF),並敢於將數據庫作為單一故障點(SPOF)。

措辭問題

是的,休眠插件稱為 enver,但從科學觀點來看,enver(entity-version) 只是實體中標有@Version的版本屬性。 正確的名稱是 audition,因為您在歷史上記錄了數據庫中表的所有更改。

如果“更改實體表”已經有行。

首先要說的是實體表中的每個有效負載列都可以為空,您必須在試聽表中添加一個列,默認情況下它具有 null 值。 但是,如果真表不允許列中包含空值,則試聽會被破壞。 這會導致意想不到的問題。 這意味着真實列到審計列的自動復制必須是重構模式和數據的過程。

暫無
暫無

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

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