revinfo
表的默认 DDL 如下所示:
CREATE TABLE revinfo (
rev int4 NOT NULL,
revtstmp int8 NULL,
CONSTRAINT revinfo_pkey PRIMARY KEY (rev)
);
我的要求是将
rev
列作为non-monotonic
最好是UUID
类型。但我的探索表明 @RevisionNumber
注释要求 rev 字段仅接受 int, Integer, Long & long
数据类型。
Hibernate envers 是否支持更改 rev 列的数据类型,如果是,那么如何完成,或者是否有一些替代方法可以在不需要 revinfo 表的情况下实现表的审计机制?
Hibernate Envers 的@RevisionNumber 确实只支持基于整数的数据类型(int、Integer、Long 和 long)。但是,您仍然可以为修订标识符列使用 UUID 数据类型,但是您需要实现自己的自定义修订实体侦听器来生成 UUID 值并将其分配给该列。
以下是可能对您有所帮助的文档链接:
https://docs.jboss.org/hibernate/orm/current/userguide/html_single/Hibernate_User_Guide.html#envers
遗憾的是,Hibernate Envers 不支持更改 rev 列的数据类型。
@RevisionNumber
注释只能用于 int、Integer、Long 和 long 数据类型。如果您需要使用非单调标识符(例如 UUID)作为修订号,您将需要实现自己的自定义修订实体并使用 @RevisionEntity
注释来指定它。
要实现您的自定义修订实体,您需要创建一个新的实体类来实现
org.hibernate.envers.DefaultRevisionEntity
接口。在此类中,您可以使用 @Id
和 @GeneratedValue
注释定义自己的自定义修订号字段。您可以为此字段使用 UUID 数据类型。创建自定义修订实体后,您可以使用 @RevisionEntity
注释在需要审核的实体中指定它。
或者,您可以考虑使用不同的审计框架,它支持开箱即用的非单调标识符,例如
Apache Camel's Debezium
。但是,这可能需要对现有代码库和基础架构进行重大更改。