首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在使用envers时保存其他属性

如何在使用envers时保存其他属性
EN

Stack Overflow用户
提问于 2016-12-08 07:58:23
回答 2查看 1.2K关注 0票数 0

我使用Hibernate Envers作为我的修订历史记录。这是我的表设置:

代码语言:javascript
运行
复制
CREATE TABLE EPIC (
epicid SERIAL NOT NULL,
accountid BIGINT NOT NULL, 
description TEXT NOT NULL UNIQUE,
epicowner TEXT NOT NULL,
PRIMARY KEY(epicid)
);

CREATE TABLE EPIC_AUD(
epicid BIGINT NOT NULL ,
REV BIGINT NOT NULL,
accountid BIGINT,
description TEXT,
epicowner TEXT,
REVTYPE BIGINT,
PRIMARY KEY(epicid,REV)
);

目前,当我进行更改时,它只保存复合主键值和修订类型。因为我还想记录删除某个实体的用户,所以我也想保存这个值。这是我用来删除实体的代码。

代码语言:javascript
运行
复制
@Override
public boolean deleteItem(Epic epicFromFrontend) {
    transactionBegin();
    Epic epicToRemove = getEntityManager().find(Epic.class,  epicFromFrontend.getEpicid());
    epicToRemove.setAccountid(epicFromFrontend.getAccountid());
    getEntityManager().remove(epicToRemove);
    return transactionEnd();
}

其实我有两个问题:

  1. 如何保存账户
  2. 或者保存所有数据可能更聪明更好。因此,在删除后,我的EPIC_AUD表中没有空字段。
EN

回答 2

Stack Overflow用户

发布于 2016-12-08 14:57:19

在域实体的插入、更新或删除过程中捕获特定于审计的各种附加信息是一种常见的做法。

一种简单而又具有侵入性的方法是将该状态存储在与实体相同的结构中,正如Marcin H所建议的那样。虽然这种方法可能有效,但是这种方法存在一些问题。

  1. 混合关注 这里的问题是,历史相关信息现在正被存储在与域相关的数据旁边。与安全性非常相似的是,审计是一个横切的关注点,因此在数据结构方面应该以同样的方式处理。此外,当对模式中的多个已审计行进行操作时,您通常会跨多个表表示相同的用户、时间戳等,这会导致不必要的模式和表膨胀。
  2. 不必要的字段/数据删除操作() 当您在实体本身上存储这个杯标的字段时,它引入了一组有趣的需求,作为实体删除过程的一部分。如果希望Envers跟踪该删除用户,则必须在删除之前与该用户执行实体更新,或者引入一个额外的列来跟踪一行是否如Marcin H所建议的那样被软删除。

这种方法意味着即使删除了delete,表也会无限期地增长。它可能会对长期查询性能和其他各种问题产生负面影响。理想情况下,如果数据不再相关,除非是出于历史目的,而且不存在必须维护的FK关系,那么从非审计表中删除行要好得多。

与上述不同,我建议使用我发布的here策略,该策略描述了如何利用自定义RevisionEntity数据结构与Envers一起使用,允许您跟踪与当前事务操作相关的多列数据。

这种办法有下列额外好处:

  1. 在DAO方法中没有一个特定的代码。DAO方法仍然只关注特定于域的操作,这是应该的。
  2. 在单个事务期间操作多个实体的情况下,您现在只捕获每个事务一次的各种审计属性(也称为每次修订一次)。这意味着如果用户添加、删除和更新各种行,它们都将被标记一次。
  3. 现在您可以很容易地跟踪执行行删除的人,因为审计属性保留在RevisionEntity上,这将为删除而生成。不需要特殊的操作或字段来处理这种情况。此外,还可以在删除时存储实体快照,然后访问(1)谁删除了行,以及(2)删除之前的行看起来如何。
票数 2
EN

Stack Overflow用户

发布于 2016-12-08 08:09:37

您可以向表epic中添加属性record_active布尔,当然也可以添加到表epic_aud。当record_active为false时,它意味着记录已被“删除”。永远不要实际删除任何记录--这是一个很好的实践,事实上:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41034478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档