Swiftorial Logo
Home
Swift Lessons
Tutorials
Learn More
Career
Resources

Introduction to Spring Data Envers

Spring Data Envers is a powerful framework that simplifies auditing of entity changes in Spring-based applications using Hibernate Envers. This guide covers key concepts and steps for getting started with Spring Data Envers, including adding dependencies, configuring Envers, defining audited entities, and querying audit history.

Key Concepts of Spring Data Envers

  • Spring Data Envers: A framework that provides easy integration with Hibernate Envers, simplifying the auditing of entity changes.
  • Audited Entities: Entities that are tracked for changes.
  • Audit History: Historical records of entity changes.
  • Revision Entity: Entity that stores revision information.

Adding Dependencies

Include the Spring Data Envers dependency in your pom.xml file:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-envers</artifactId>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

Configuring Envers

Configure Hibernate Envers settings in your application.properties or application.yml file:

Example: application.properties

spring.jpa.properties.hibernate.envers.audit_table_prefix=audit_
spring.jpa.properties.hibernate.envers.audit_table_suffix=_history

Defining Audited Entities

Create an entity class and annotate it with @Audited to enable auditing:

Example: User.java

// User.java
package com.example.myapp.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import org.hibernate.envers.Audited;

@Entity
@Audited
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String username;
    private String password;

    // Getters and setters
}

Querying Audit History

Use the AuditReader to query the audit history of an entity:

Example: UserService.java

// UserService.java
package com.example.myapp.service;

import com.example.myapp.model.User;
import org.hibernate.envers.AuditReader;
import org.hibernate.envers.AuditReaderFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.persistence.EntityManager;
import javax.transaction.Transactional;
import java.util.List;

@Service
public class UserService {

    @Autowired
    private EntityManager entityManager;

    @Transactional
    public List getRevisions(Long userId) {
        AuditReader auditReader = AuditReaderFactory.get(entityManager);
        return auditReader.getRevisions(User.class, userId);
    }

    @Transactional
    public User getRevision(Long userId, Number revision) {
        AuditReader auditReader = AuditReaderFactory.get(entityManager);
        return auditReader.find(User.class, userId, revision);
    }
}

Testing Spring Data Envers

Test your Spring Data Envers setup to ensure it works as expected:

Example: UserServiceTests.java

// UserServiceTests.java
package com.example.myapp;

import com.example.myapp.model.User;
import com.example.myapp.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

import static org.assertj.core.api.Assertions.assertThat;

@SpringBootTest
public class UserServiceTests {

    @Autowired
    private UserService userService;

    @Test
    @Transactional
    public void testUserAudit() {
        User user = new User();
        user.setUsername("testuser");
        user.setPassword("password");
        user = userService.saveUser(user);

        List revisions = userService.getRevisions(user.getId());

        assertThat(revisions).isNotEmpty();

        User revision = userService.getRevision(user.getId(), revisions.get(0));
        assertThat(revision.getUsername()).isEqualTo("testuser");
    }
}

Key Points

  • Spring Data Envers: A framework that provides easy integration with Hibernate Envers, simplifying the auditing of entity changes.
  • Audited Entities: Entities that are tracked for changes.
  • Audit History: Historical records of entity changes.
  • Revision Entity: Entity that stores revision information.
  • Include the Spring Data Envers dependency in your pom.xml file.
  • Configure Hibernate Envers settings in your application.properties or application.yml file.
  • Create an entity class and annotate it with @Audited to enable auditing.
  • Use the AuditReader to query the audit history of an entity.
  • Test your Spring Data Envers setup to ensure it works as expected.

Conclusion

Spring Data Envers simplifies auditing of entity changes in Spring-based applications by providing easy integration with Hibernate Envers. By understanding and implementing audited entities, querying audit history, and testing your setup, you can effectively manage audit logs in your Spring Boot application. Happy coding!