【问题标题】:How to keep a history of edit of Entities in a JPA application如何在 JPA 应用程序中保留实体的编辑历史
【发布时间】:2023-03-14 04:46:01
【问题描述】:

JavaEE 和 JPA 应用程序需要记录用户所做的所有更改。

目前,对于所有实体,都有字段记录 createdBy 和 lastEditedBy 属性。然而,这些属性无法满足记录所有编辑的要求。

记录特定实体所有编辑历史的最佳方式是什么?

我不使用 Spring。

【问题讨论】:

  • 您不能使用数据库触发器来跟踪更改吗?
  • 能否给个参考链接?
  • 这取决于您使用的数据库服务器。对于 postgresql,您可以在那里查看:postgresqltutorial.com/creating-first-trigger-postgresql
  • 这样改变的目的是什么?您希望如何使用存储的信息?另一个非常重要的问题是 IMO 更改的频率如何?还有一个问题,应用程序是否处于高负载状态(换句话说,与数据库的额外交互是否可以接受)?

标签: jpa jpa-2.0


【解决方案1】:

您可以使用Javers,它是数据库和框架无关的工具来维护操作历史记录。

JaVers 和 Envers 之间有两大区别:

  1. Envers 是 Hibernate 插件。它与 Hibernate 有很好的集成 但您只能将它与传统的 SQL 数据库一起使用。如果你选择 NoSQL 数据库或 SQL,但带有另一个持久性框架(用于 例如 JOOQ) — Envers 不是一个选项。

    相反,JaVers 可以用于任何类型的数据库和任何 一种持久性框架。目前,JaVers 带有存储库 MongoDB 和流行的 SQL 数据库的实现。其他数据库 (如 Cassandra、Elastic)将来可能会添加。

  2. Envers 的审计模型是面向表格的。您可以将 Envers 视为 用于对数据库记录进行版本控制的工具。

    JaVers 的审计模型是面向对象的。一切都与对象有关 快照。 JaVers 将它们保存到单个表(或 Mongo)作为具有统一结构的 JSON 文档。

您还可以使用触发器和存储对象差异来实现此目的。

编辑: JaversAuditableAspect 适用于任何类型的存储库。 它定义了使用方法级 @JaversAuditable 注释注释的任何方法的切入点。如果您有不受 Spring Data 管理的存储库,请选择它。

@Bean public JaversAuditableAspect javersAuditableAspect() { return new JaversAuditableAspect(javers(), authorProvider(), commitPropertiesProvider()); }

【讨论】:

  • 谢谢。贾弗斯似乎是最好的选择。谷歌搜索表明它需要 Spring。没有Spring我能做到吗?
  • 是的,它也可以在没有 Spring 的情况下使用。该方法可在文档中找到。编辑我的答案给你一个简短的。
【解决方案2】:

您可以使用 Hibernate 的 Envers 来审核您的实体。它允许您跟踪对实体所做的所有更改 - 甚至是已删除的更改。很可能您已经在使用 Hibernates(作为 JPA 提供者),所以集成应该没问题。

https://hibernate.org/orm/envers/

【讨论】:

  • 我使用 JPA 和 EclipseLink,而不是休眠
猜你喜欢
  • 2016-07-22
  • 1970-01-01
  • 2018-01-03
  • 1970-01-01
  • 1970-01-01
  • 2022-11-23
  • 2011-09-08
  • 1970-01-01
  • 2018-07-25
相关资源
最近更新 更多