當Hibernate執行其元數據收集過程時,它首先讀取所有註釋的實體類並按名稱註冊它們中的每一個。此外,由於Envers處理其元數據並將該信息提供給Hibernate,Hibernate隨後將依次通過名稱註冊每個經審計的實體。
這裏的問題是,如果沒有提供後綴或前綴,Hibernate將Envers的映射視爲已註冊的實體名稱,因爲沒有前綴/後綴,它們的命名與它們生成的源實體完全相同從,導致這個錯誤。
org.hibernate.DuplicateMappingException: Duplicate class/entity mapping
有一個解決方法,但它可能是繁瑣的,取決於您可能有審計實體的數量。我已經在5.x上測試過了,我可能懷疑這應該在4.3.x上運行。
- 設置
audit_table_prefix
或audit_table_suffix
配置屬性。這是一個必須,因爲這將強制來自Envers的元數據是唯一命名爲Hibernate的可持久對象。如果不這樣做,您將繼續從上方獲取重複的映射錯誤。
- 對於每個審計實體,明確添加一個
@AuditTable
註釋,您可以在其中專門將審計表名稱設置爲與爲您的實體生成的名稱相同,無論它是基於類名還是具有名稱屬性的現有@Table
。
因此,作爲一個例子:
@Entity
@Table(name = "my_table")
@AuditTable("my_table")
public class MyTableEntity {
/* stuff */
}
所以用這個配置,你就可以有一個模式中你Envers表,另一個主要的實體表,這兩個模式有其表的名字相同。
希望這會有所幫助。
因此,您在數據庫的默認模式中擁有未經審計的JPA實體,並且已經在另一個明確設置的模式中獲得了您的Envers審計實體表?什麼版本的Hibernate? – Naros
Hi @Naros!再次感謝幫助=)。確切地說,我在數據庫的默認架構中擁有未經審計的實體,並且在另一個明確設置的架構中,我的Envers審計了實體表。我正在使用休眠4.3.11-FINAL –