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
orapplication.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!