Hibernate Envers Audit表没有后缀

时间:2016-07-12 18:47:26

标签: hibernate hibernate-envers

我正在尝试将审核表保存在另一个模式中,但保持表与审计表的名称相同。我没有问题更改后缀或使用其他架构,但当我将后缀设置为空字符串时,我收到以下错误:

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

我猜这个错误正在发生,因为我有两个同名的表(但在不同的模式中),我正确地设置了“org.hibernate.envers.default_schema”和“hibernate.default_schema”参数,我没想到这个问题。

1 个答案:

答案 0 :(得分:1)

当Hibernate执行其元数据收集过程时,它首先读取所有带注释的实体类,并按名称注册每个类。此外,当Envers处理其元数据并将该信息提供给Hibernate时,Hibernate将依次按名称注册每个审计实体。

这里的问题是,如果不提供后缀或前缀,Hibernate会将Envers的映射视为已注册的实体名称,因为没有前缀/后缀,它们的名称与它们生成的源实体完全相同,导致此错误。

org.hibernate.DuplicateMappingException: Duplicate class/entity mapping

有一种解决方法,但根据您可能拥有的审计实体数量,这可能会很乏味。我在5.x上测试了这个,我可能怀疑这应该适用于4.3.x。

  1. 设置audit_table_prefixaudit_table_suffix配置属性。这是必须,因为这将迫使Envers的元数据成为Hibernate唯一命名的可持久对象。如果不这样做,您将继续从上面获得重复的映射错误。
  2. 对于每个经审核的实体,明确添加@AuditTable注释,您可以在其中专门设置审核表名称,使其与为您的实体生成的名称相同,无论是基于类名还是现有{ {1}}具有名称属性。
  3. 以此为例:

    @Table

    因此,使用此配置,您将能够将Envers表放在一个模式中,将主要实体表放在另一个模式中,并且两个模式的表名都相同。

    希望这有帮助。