没有后缀的 Hibernate 反向审计 table

Hibernate Envers Audit table with no suffix

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

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

我猜这个错误的发生是因为我有两个同名的 table(但在不同的架构中),我设置了 "org.hibernate.envers.default_schema" 和 "hibernate.default_schema" 参数没错,我没想到会出现这个问题。

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

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

org.hibernate.DuplicateMappingException: Duplicate class/entity mapping

有一个解决方法,但它可能很乏味,具体取决于您可能拥有的审计实体的数量。我已经在 5.x 上对此进行了测试,我可能怀疑这应该适用于 4.3.x.

  1. 设置 audit_table_prefixaudit_table_suffix 配置属性。这是一个 必须 因为这将强制来自 Envers 的元数据被唯一命名为 Hibernate 的 persistable 对象。如果不这样做,您将继续收到上面的重复映射错误。
  2. 对于每个被审计的实体,明确添加一个 @AuditTable 注释,您可以在其中专门将审计 table 名称设置为与为您的实体生成的名称相同,无论它是基于class 名称或具有名称属性的现有 @Table

举个例子:

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

因此,通过此配置,您将能够在一个模式中拥有您的 Envers table,在另一个模式中拥有主要实体 table,并且两个模式都有其 table名字相同。

希望对您有所帮助。