Envers 如何处理架构更改?

我正在考虑从自实现的版本控制解决方案切换到Hibernate Envers,但我还不太确定。我已经阅读了很多关于它的文章,但我担心模式变化以及Envers在根据旧模式获得历史化数据后如何处理它们。

在这方面,您对Envers有什么经验?如何使用 Envers 处理架构更改和现有数据?

更新 1:

这不仅仅是从表中添加删除简单列的内容,而是例如,将简单的Forein-Key-Relationship更改为具有两个1:n关系(具有属性列的M2M)的单独实体时。这是数据模型中的“逻辑”更改。当使用Envers时,当根据旧模型已经有历史化的数据时,您如何处理这个问题?有没有替代方法来手动编写sql脚本并将其传输到新的表示形式中?


答案 1

根据我的经验,Envers 只是将实体表中的每个字段复制到其审计表中。审核表中复制的字段对它们没有约束,包括可空性和外键约束,因此在实际表上添加或删除此类约束没有问题。您添加到实体的任何类型的关系都将只是在 Envers 下添加的新审核列和/或表,由您决定在其历史上下文中正确解释它们。

对于您的示例,如果我理解正确,从基于连接列的关系切换到基于连接表的关系,您只需让旧的连接列与连接表共存,并且在直接转换时,前者将停止填充,以支持后者。您的历史记录将完全保留,包括您进行此切换的事实。如果希望所有旧数据都适合审核表中的新模型,则由你来执行迁移。


答案 2

修改现有架构应该没有问题,因为 Envers 依赖于您的@Entities来创建审核表。因此,如果您在现有表中添加或删除列,只要此更改反映在JavaBean@Entity/ @Audited中,就应该没问题。


推荐