提问者:小点点

Hibernate Envers没有后缀的审计表


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

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

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


共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注释,您可以在其中特别将审计表名称设置为与为您的实体生成的名称相同,无论它是基于类名还是基于具有名称属性的现有@Table

所以举个例子:

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

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

希望这有帮助。