Hibernate Envers 管理的审计表的主键是啥?
Posted
技术标签:
【中文标题】Hibernate Envers 管理的审计表的主键是啥?【英文标题】:What is the primary key of an audit table managed by Hibernate Envers?Hibernate Envers 管理的审计表的主键是什么? 【发布时间】:2012-05-08 04:54:00 【问题描述】:我正在使用 Hibernate Envers 来审计一些实体。我手动创建了关联的审计表。但是,我无法确定审计表的主键应该是什么。例如,考虑一个用于存储客户的虚构表格:
CREATE TABLE CUSTOMER
(
CUSTOMER_ID INTEGER,
CUSTOMER_NAME VARCHAR(100),
PRIMARY KEY (CUSTOMER_ID)
)
然后你创建审计表:
CREATE TABLE CUSTOMER_REVISION
(
REVISION_ID INTEGER,
REVISION_TYPE_ID INTEGER,
CUSTOMER_ID INTEGER,
CUSTOMER_NAME VARCHAR(100),
PRIMARY KEY (???)
)
以下是我考虑过的选项:
主键:REVISION_ID
这不能是主键,因为同一类的多个实体可能在同一修订期间被修改。
主键:(REVISION_ID
, CUSTOMER_ID
)
这似乎更有可能,但我不确定 Envers 是否会在每次修订时为每位客户插入多条记录。
主键:(REVISION_ID
, REVISION_TYPE_ID
, CUSTOMER_ID
)
这似乎有点矫枉过正,但 Envers 可能会在每次修订时为每位客户插入不同类型的记录(add
、modify
或 delete
)。
主键:新列
也许主键必须只是包含合成主键的另一列。
Hibernate Envers 管理的审计表的真正主键是什么?
【问题讨论】:
【参考方案1】:从the documentation 中的示例来看,我的示例中的主键似乎是(REVISION_ID
,CUSTOMER_ID
)。这是文档中的示例:
create table Address (
id integer generated by default as identity (start with 1),
flatNumber integer,
houseNumber integer,
streetName varchar(255),
primary key (id)
);
create table Address_AUD (
id integer not null,
REV integer not null,
flatNumber integer,
houseNumber integer,
streetName varchar(255),
REVTYPE tinyint,
***primary key (id, REV)***
);
【讨论】:
没错。在每个修订版中,一个实体最多可以修改一次 :) 如果一个实体在一个 tx 中有多个更改,它们将被合并并仍然导致一个修改。【参考方案2】:审计表的主键是审计表的原始id(id)和修订号(rev)的组合。 作为官方文档,在给定的版本中,给定实体实例最多可以有一个历史条目,这仅仅意味着上述两列的唯一组合。
【讨论】:
以上是关于Hibernate Envers 管理的审计表的主键是啥?的主要内容,如果未能解决你的问题,请参考以下文章
审计没有 Hibernate Envers 的 java 实体
在 Spring Hibernate java 项目中使用“Envers”审计表