【问题标题】: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 可能会在每次修订时为每位客户插入不同类型的记录(addmodifydelete)。

主键:新列

也许主键必须只是包含合成主键的另一列。


Hibernate Envers 管理的审计表的真正主键是什么?

【问题讨论】:

    标签: java hibernate hibernate-envers


    【解决方案1】:

    the documentation 中的示例来看,我的示例中的主键似乎是(REVISION_IDCUSTOMER_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)的组合。 作为官方文档,在给定的版本中,给定实体实例最多可以有一个历史条目,这仅仅意味着上述两列的唯一组合。

    【讨论】:

      猜你喜欢
      • 2017-05-07
      • 2023-03-24
      • 1970-01-01
      • 2016-03-19
      • 2018-09-19
      • 2015-08-20
      • 1970-01-01
      • 2015-12-14
      • 2016-11-15
      相关资源
      最近更新 更多