Hibernateはメタデータ収集プロセスを実行するとき、最初にすべての注釈付きエンティティクラスを読み込み、それらをそれぞれ名前で登録します。さらに、Enversがそのメタデータを処理し、その情報をHibernateに返すと、Hibernateはそれらの監査されたエンティティのそれぞれを名前で登録します。
ここでの問題は、接尾辞/接尾辞なしで、それらが生成されたソースエンティティと全く同じ名前になっているため、接尾辞または接頭辞を付けずに、Enversからのマッピングを既に登録されたエンティティ名と見なすことですから、このエラーが発生します。
org.hibernate.DuplicateMappingException: Duplicate class/entity mapping
回避方法がありますが、監査対象のエンティティの数によっては面倒なことがあります。私はこれを5.xでテストしましたが、これは4.3.xで動作するはずです。
audit_table_prefix
またはaudit_table_suffix
のいずれかの設定プロパティを設定します。 はである必要があります。これは、EnversのメタデータがHibernateへのユニークな名前の永続オブジェクトになるよう強制するためです。これを行わなければ、上から重複したマッピングエラーが引き続き発生します。
- 監査対象のエンティティごとに、監査テーブル名を、エンティティに生成される名前と同一にするように明示的に設定する場合は、
@AuditTable
アノテーションを明示的に追加します。クラス名に基づいているか、またはname属性を持つ既存の@Table
。だから、例として
:
@Entity
@Table(name = "my_table")
@AuditTable("my_table")
public class MyTableEntity {
/* stuff */
}
したがって、この構成では、あなたが、別の主なエンティティテーブル1つのスキーマにごEnversテーブルを持つことができるようになりますし、両方のスキーマがそのテーブル名を持っています同一である。
これが役に立ちます。
データベースのデフォルトスキーマにJPA監査されていないエンティティがあり、Envers監査エンティティテーブルが別の明示的に設定されたスキーマにありますか?どのバージョンのHibernate? – Naros
こんにちは@Naros!助けてくれてありがとう=)。正確には、データベースのデフォルトスキーマに監査対象外のエンティティを持ち、別の明示的に設定されたスキーマ内でエンティティテーブルを監査します。私は休止状態を使用しています。4.3.11-FINAL –