是否可以修改Javers中存储的JPA实体审计历史记录?
Javers修改历史审计记录可行性说明
核心结论
Javers原生不支持修改已留存的审计历史,这是它作为审计框架的核心设计原则决定的:审计日志本身要保证不可篡改,才能满足合规溯源的要求。
具体原因
- Javers的所有审计数据以Commit为单位链式存储,每个Commit都有唯一标识和完整性校验,后续版本的生成依赖前序版本的变更记录,原生没有开放修改历史Commit、快照的公开API。
- 你通过
javers.findShadows()查询得到的Shadow Object,本质是Javers基于历史快照还原出来的只读视图,你在内存中对这个对象的修改不会被Javers感知,也不存在对应的持久化方法可以把修改同步回Javers的审计存储库。 - 你用到的查询逻辑
QueryBuilder.byInstanceId("Frodo", Employee.class).withShadowScope(ShadowScope.DEEP_PLUS).from(date).build()返回的所有Shadow对象都没有绑定Javers的持久化上下文,原生没有提供类似saveShadow()的写入接口。
替代方案
如果确实有修正审计记录的需求,可以按优先级选择以下方案:
- 提交新版本修正:把对应实体调整为你需要的正确状态后,主动调用
javers.commit()方法提交一次新的变更,Javers会生成一条新的审计版本,后续查询返回的就是修正后的内容,同时原始历史记录会保留,符合审计的合规要求,是最推荐的处理方式。 - 直接操作存储表(极不推荐):如果必须修改/删除某段历史记录,只能手动操作Javers对应的审计存储表(比如关系型数据库下的
jv_commit、jv_snapshot等表),但你需要自行处理快照的反序列化、修改后重新序列化、调整Commit关联元数据、版本链校验等逻辑,操作不当会导致整个审计库数据异常,完全不建议在生产环境使用。
内容的提问来源于stack exchange,提问作者25Schmeckles
相关产品推荐
相关产品推荐

