如何运行 一次性脚本操作jpa实体数据并跟踪envers?

How to run one-off script to manipulate jpa entities data and keep trace on envers?

我想 运行 spring 上的一次性脚本来修改 jpa 实体,我希望这些更改出现在 envers 审计表上。

我有一个 spring-boot 应用程序,它使用 envers 来跟踪一些 JPA 实体的变化。它使用 liquibase 到 运行 数据库迁移以进行 DDL 更改。

理想情况下,我希望脚本是 java liquibase 迁移,但是 liquibase 运行s 在 spring 上下文初始化之前,所以只有 jdbc 语句可以是 运行。一方面,我明白背后的原因,JPA应该在数据库建立后初始化;另一方面,我希望有一个类似于 liquibase 的系统,它可以跟踪 运行 的脚本,并在 spring 上下文初始化后寻找新脚本。

关于我可以使用什么或在这种情况下最好的方法有什么建议或想法吗?

您的脚本最终可以做两件事

  1. 架构迁移
  2. 数据迁移

对于模式迁移,没有什么可以阻止该脚本将必要的模式更改应用于 envers 审计 table,就像它对 JPA 实体所做的那样映射。这可能是最好的方法,因为 table 结构应该保持同步,因此以相同的物理方式迁移,因此保持该行为集中在同一个地方只会有利于这些行为的长期一般内务管理。

对于数据迁移,这是一个完全不同的球赛。

Envers 严重依赖 Hibernate 事件侦听器框架来在 envers 审计模式中捕获更改,因此绕过或不生成此类事件的任何内容都会丢失。所以如果你想让这些操作被捕获,你要么通过ORM来完成,要么自己手动插入事件。

在 Hibernate 6 中,将有一项新功能,您可以在其中更精细地控制其自身的模式迁移功能。例如,您可以说 ORM table 永远不会更新,也许这就是您使用 Liquibase 的地方,但您可以明确地将 Envers 对象标记为始终更新。但请记住,Hibernate 的架构迁移存在局限性。

我确实有一些关于如何改进这一切的长期想法,但我还不能具体分享。我上面描述的是目前可用的或目前的一般操作方法。