2016-07-12 7 views
1

監査テーブルを別のスキーマに保存しようとしていますが、監査対象のテーブルと同じ名前のテーブルを保持しようとしています。Hibernateはサフィックスのない監査テーブルを使用します

Caused by: org.hibernate.DuplicateMappingException: Duplicate class/entity mapping com.logique...User 

私は2つのテーブルを持っているので、私はこのエラーが起こっている推測している:私は接尾辞を変更したり、別のスキーマを使用して、私は空の文字列にサフィックスを設定したときに、私は次のエラーを取得しています何の問題もなかったです(ただし、異なるスキーマで)同じ名前で、 "org.hibernate.envers.default_schema"と "hibernate.default_schema"パラメータを正しく設定しましたが、この問題は予期していませんでした。

+0

データベースのデフォルトスキーマにJPA監査されていないエンティティがあり、Envers監査エンティティテーブルが別の明示的に設定されたスキーマにありますか?どのバージョンのHibernate? – Naros

+0

こんにちは@Naros!助けてくれてありがとう=)。正確には、データベースのデフォルトスキーマに監査対象外のエンティティを持ち、別の明示的に設定されたスキーマ内でエンティティテーブルを監査します。私は休止状態を使用しています。4.3.11-FINAL –

答えて

1

Hibernateはメタデータ収集プロセスを実行するとき、最初にすべての注釈付きエンティティクラスを読み込み、それらをそれぞれ名前で登録します。さらに、Enversがそのメタデータを処理し、その情報をHibernateに返すと、Hibernateはそれらの監査されたエンティティのそれぞれを名前で登録します。

ここでの問題は、接尾辞/接尾辞なしで、それらが生成されたソースエンティティと全く同じ名前になっているため、接尾辞または接頭辞を付けずに、Enversからのマッピングを既に登録されたエンティティ名と見なすことですから、このエラーが発生します。

org.hibernate.DuplicateMappingException: Duplicate class/entity mapping 

回避方法がありますが、監査対象のエンティティの数によっては面倒なことがあります。私はこれを5.xでテストしましたが、これは4.3.xで動作するはずです。

  1. audit_table_prefixまたはaudit_table_suffixのいずれかの設定プロパティを設定します。 である必要があります。これは、EnversのメタデータがHibernateへのユニークな名前の永続オブジェクトになるよう強制するためです。これを行わなければ、上から重複したマッピングエラーが引き続き発生します。
  2. 監査対象のエンティティごとに、監査テーブル名を、エンティティに生成される名前と同一にするように明示的に設定する場合は、@AuditTableアノテーションを明示的に追加します。クラス名に基づいているか、またはname属性を持つ既存の@Table 。だから、例として

@Entity 
@Table(name = "my_table") 
@AuditTable("my_table") 
public class MyTableEntity { 
    /* stuff */ 
} 

したがって、この構成では、あなたが、別の主なエンティティテーブル1つのスキーマにごEnversテーブルを持つことができるようになりますし、両方のスキーマがそのテーブル名を持っています同一である。

これが役に立ちます。

+0

こんにちは@Naros、助けてくれてありがとう、あなたの答えをテストするのにずっと時間をかけて申し訳ありません。 「WARN:GenerationTargetが例外を受け取る例外を受け取りました:コマンドを実行できません:[alter table audit.person drop constraint FK9brsg4fcuo22u7e7oxa9g1tqn]」および「WARN:GenerationTargetに例外受け付けのコマンドがありました:コマンド[drop sequence hibernate_sequence]を実行できません」という2つの警告が表示されます。 "それについての考えは? –

+0

github、https:// githubでテストしたコードを残しました。com/Teless/TesteEnvers、できるだけシンプルな2つのクラスとプロジェクトの説明で両方の警告のスタックトレースを保持 –

+0

私は、これらの警告は、hibernateが監査テーブルとエンティティテーブルの間に外部キーを作成しようとしていた別のスキーマ)、そうですか? –

関連する問題