项目作者: adamzareba

项目描述 :
Example Spring Boot + Hibernate + Hibernate Envers project for demonstration purposes of entities auditing mechanism.
高级语言: Java
项目地址: git://github.com/adamzareba/company-structure-hibernate-history.git


Spring Boot + Hibernate + Hibernate Envers

Example Spring Boot + Hibernate + Hibernate Envers project for demonstration purposes of audit mechanism.

Getting started

To run application:

mvn package && java -jar target\company-structure-hibernate-history-1.0-SNAPSHOT.jar

Prerequisites:

  • Java 8
  • Maven
  • H2/PostgreSQL

It is possible to run application in one of two profiles:

  • h2
  • postgres

depending on database engine chose for testing.

Testing database schema

database-schema

Configuration

Separated database schema is configured to be used for audit:

  1. spring.jpa.properties.org.hibernate.envers.default_schema=audit

Audited entities are annotated with @Audited.

  1. @Entity
  2. @Table(name = "COMPANY", uniqueConstraints = {@UniqueConstraint(columnNames = {"NAME"})})
  3. @Audited
  4. @Getter
  5. @Setter
  6. @EqualsAndHashCode(of = "id")
  7. public class Company implements Serializable

Not audited entities need to be exluded from related entities. Since Car entity is not audited, it needs to be excluded from relationship like below:

  1. @OneToMany(cascade = CascadeType.ALL, mappedBy = "company", fetch = FetchType.LAZY, orphanRemoval = true)
  2. @JsonManagedReference
  3. @NotAudited
  4. private Set<Car> cars = new HashSet<>();

Implementation

Enhanced RevisionEntity:

  1. @Entity
  2. @RevisionEntity(AuditRevisionListener.class)
  3. @Table(name = "REVINFO", schema = "audit")
  4. @AttributeOverrides({
  5. @AttributeOverride(name = "timestamp", column = @Column(name = "REVTSTMP")),
  6. @AttributeOverride(name = "id", column = @Column(name = "REV"))})
  7. @Getter
  8. @Setter
  9. public class AuditRevisionEntity extends DefaultRevisionEntity {
  10. @Column(name = "USERNAME", nullable = false)
  11. private String username;
  12. }

Enhanced RevisionListener:

  1. public class AuditRevisionListener implements RevisionListener {
  2. @Override
  3. public void newRevision(Object revisionEntity) {
  4. AuditRevisionEntity audit = (AuditRevisionEntity) revisionEntity;
  5. audit.setUsername("admin");
  6. }
  7. }