我正在尝试将审核表保存在另一个模式中,但保持表与审计表的名称相同。我没有问题更改后缀或使用其他架构,但当我将后缀设置为空字符串时,我收到以下错误:
Caused by: org.hibernate.DuplicateMappingException: Duplicate class/entity mapping com.logique...User
我猜这个错误正在发生,因为我有两个同名的表(但在不同的模式中),我正确地设置了“org.hibernate.envers.default_schema”和“hibernate.default_schema”参数,我没想到这个问题。
答案 0 :(得分:1)
当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
注释,您可以在其中专门设置审核表名称,使其与为您的实体生成的名称相同,无论是基于类名还是现有{ {1}}具有名称属性。以此为例:
@Table
因此,使用此配置,您将能够将Envers表放在一个模式中,将主要实体表放在另一个模式中,并且两个模式的表名都相同。
希望这有帮助。