我在修订历史记录中使用了Hibernate Envers。 这是我的表格设置:
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)
);
目前,当我进行更改时,它仅保存复合主键值和修订类型。由于我还想记录删除某个实体的用户,我也想保存该值。这是我用于删除实体的代码。
@Override
public boolean deleteItem(Epic epicFromFrontend) {
transactionBegin();
Epic epicToRemove = getEntityManager().find(Epic.class, epicFromFrontend.getEpicid());
epicToRemove.setAccountid(epicFromFrontend.getAccountid());
getEntityManager().remove(epicToRemove);
return transactionEnd();
}
其实我有两个问题:
答案 0 :(得分:1)
通常的做法是在插入,更新或删除域实体期间捕获特定于审核的各种其他信息。
一种简单但具有侵入性的方法是将该状态存储在与实体相同的结构中,如Marcin H所建议的那样。虽然这种方法可行,但这种方法存在一些问题。
混合问题
这里的问题是历史相关信息现在与域特定数据一起存储。与安全性非常相似,审计是一个跨领域的问题,因此在数据结构方面应该以同样的方式对待。此外,由于操作模式中的多个审计行,您通常会在多个表中表示相同的用户,时间戳等,从而导致不必要的架构和表膨胀。
数据删除不必要的字段/操作
当您将该calibur的字段存储在实体本身时,它会引入一组有趣的需求作为实体删除过程的一部分。如果您希望Envers跟踪该删除用户,那么您必须在删除之前使用该用户执行实体更新,或者引入一个额外的列来跟踪是否软删除行,如Marcin H.所示
我建议使用我发布的here策略来描述如何利用Envers自定义 RevisionEntity 数据结构,而不是上述内容,允许您跟踪多列数据。与当前的交易操作有关。
此方法具有以下额外好处:
答案 1 :(得分:0)
您可以将attribue record_active boolean 添加到表格epic,以及表格 epic_aud 当然。 当 record_active false 时,表示记录已被删除"。 永远不要删除任何物理记录 - 事实上它是一种好的做法:)