Hibernate 4 审计

原文: https://javabeginnerstutorial.com/hibernate/auditing-with-hibernate-4/

在本文中,我将向您简要介绍使用 Hibernate 进行实体审计,或更具体地说,是使用 Hibernate Envers,因为这是 Hibernate 核心的 3.x 版本的一部分。

顺便说一句:Envers 保留用于实体版本控制。

我为什么要关心审计?

如果您从事较大的项目(或将来某个时候),则审计将在您的应用中扮演重要角色,以监视谁更改了敏感数据。 有时仅监视谁进行了更改是不够的:您想知道已更改的内容以及哪些值也已更改。

为此,您可以创建自己的自定义解决方案或使用 Hibernate Envers,它是 Hibernate 核心的一部分,提供了开箱即用的功能。

仅提及一个场景:您是汽车零售应用的开发人员。 有人出售一辆豪华轿车的正常价格要低 80% 的汽车,却没人知道谁改变了价格。 最后,您会感到后悔,因为您没有监视,因此必须在很短的时间内解决此问题。

如果听起来很绝望,并且您想袖手旁观,请继续阅读。

Hibernate Envers 的易用性

要使 Hibernate Envers 正常工作,您需要将其导入到类路径中,或者如果使用 Maven,则将其作为依赖项:

  1. <dependency>
  2. <groupId>org.hibernate</groupId>
  3. <artifactId>hibernate-envers</artifactId>
  4. <version>4.3.10.Final</version>
  5. </dependency>

如果您的类路径上有 Envers,只需在要审计的实体或属性上使用 [受电子邮件保护] 注解:

  1. @Entity
  2. @Table(name = "BOOKS")
  3. @Audited
  4. public class Book {
  5. // ... the body of the entity
  6. }

在这种情况下,Hibernate 自动管理实体的版本控制。 它将创建一个包含实体表名称和后缀_AUD的表。 在此示例BOOKS_AUD中,它在那里存储实体的所有字段以及两个额外的列:REVTYPEREV

REVTYPE是修订版本的类型,它可以采用值addmoddel分别插入,修改或删除。

REV字段保存所存储条目的修订号。

如果仅使用@Audited注解对实体的一个或某些字段进行注解,则*_AUD表将包含两个额外的审计字段,即使用@Audited注解的字段和实体的 ID。

Hibernate 创建了一个称为REVINFO的额外表,其中在实体发生更改时REV编号与时间戳进行映射。

自定义修订表

您可以根据需要自定义修订表,以使用所需的信息扩展核心功能。 正如我上面提到的,一种这样的情况是与实体更改一起记录与应用会话关联的当前用户(在 Web 应用的情况下)。

为此,您需要一个自定义@Entity对象,该对象扩展了org.hibernate.envers.DefaultRevisionEntity并具有@RevisionEntity注解。 对于@RevisionEntity,如果要更新表中的数据,则必须添加自定义监听器类。 在此示例中,它将是用户名。 该监听器必须实现org.hibernate.envers.RevisionListener接口,如下所示。

  1. @Entity
  2. @RevisionEntity(AuditRevisionListener.class)
  3. public class AuditEntity extends DefaultRevisionEntity {
  4. private String username;
  5. // getters and setters
  6. }
  7. public class AuditRevisionListener implements RevisionListener {
  8. @Override
  9. public void newRevision(Object revisionEntity) {
  10. final AuditEntity auditEntity = (AuditEntity) revisionEntity;
  11. // normally you would set here the name of the current user
  12. auditEntity.setUsername("GHajba");
  13. }
  14. }

在生产过程中切换审计表

您应该关心的一件事是在生产(甚至测试)期间切换审计表。 引入新表后,修订 ID(审计表中REV字段的内容)将立即重置并开始从 1 开始计数(如果您未指定其他任何要开始的序列)。 这意味着您必须知道何时切换以找到正确的修订信息,以找到正确的修订信息。

总结

如您所见,Hibernate 提供了一种很好的简便方法来对实体进行版本控制。 但是,我还是只是简单地探讨了各种可能性,但我希望我能给您一个好的起点。

代码下载

在此处下载 Hibernate 实体版本代码