我使用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();
}
其实我有两个问题:
发布于 2016-12-08 14:57:19
在域实体的插入、更新或删除过程中捕获特定于审计的各种附加信息是一种常见的做法。
一种简单而又具有侵入性的方法是将该状态存储在与实体相同的结构中,正如Marcin H所建议的那样。虽然这种方法可能有效,但是这种方法存在一些问题。
这种方法意味着即使删除了delete,表也会无限期地增长。它可能会对长期查询性能和其他各种问题产生负面影响。理想情况下,如果数据不再相关,除非是出于历史目的,而且不存在必须维护的FK关系,那么从非审计表中删除行要好得多。
与上述不同,我建议使用我发布的here策略,该策略描述了如何利用自定义RevisionEntity数据结构与Envers一起使用,允许您跟踪与当前事务操作相关的多列数据。
这种办法有下列额外好处:
发布于 2016-12-08 08:09:37
您可以向表epic中添加属性record_active布尔,当然也可以添加到表epic_aud。当record_active为false时,它意味着记录已被“删除”。永远不要实际删除任何记录--这是一个很好的实践,事实上:)
https://stackoverflow.com/questions/41034478
复制相似问题