|
| 1 | +package com.sanju.envers; |
| 2 | + |
| 3 | +import com.sanju.envers.config.AppConfig; |
| 4 | +import com.sanju.envers.entity.Department; |
| 5 | +import com.sanju.envers.entity.Employee; |
| 6 | +import com.sanju.envers.service.DepartmentService; |
| 7 | +import com.sanju.envers.service.EmployeeService; |
| 8 | +import org.hibernate.envers.AuditReader; |
| 9 | +import org.hibernate.envers.AuditReaderFactory; |
| 10 | +import org.hibernate.envers.DefaultRevisionEntity; |
| 11 | +import org.hibernate.envers.RevisionType; |
| 12 | +import org.hibernate.envers.query.AuditQuery; |
| 13 | +import org.springframework.context.annotation.AnnotationConfigApplicationContext; |
| 14 | +import org.springframework.transaction.support.TransactionSynchronizationManager; |
| 15 | + |
| 16 | +import javax.persistence.EntityManagerFactory; |
| 17 | +import java.sql.SQLException; |
| 18 | +import java.util.List; |
| 19 | + |
| 20 | +public class Application { |
| 21 | + public static void main(String[] args) throws SQLException { |
| 22 | + |
| 23 | + System.out.println("Transaction Open?.... " + TransactionSynchronizationManager.isActualTransactionActive()); |
| 24 | + AnnotationConfigApplicationContext configApplicationContext = new AnnotationConfigApplicationContext(AppConfig.class); |
| 25 | + EmployeeService employeeService = configApplicationContext.getBean(EmployeeService.class); |
| 26 | + DepartmentService departmentService = configApplicationContext.getBean(DepartmentService.class); |
| 27 | + |
| 28 | + |
| 29 | + /*Insert data to test*/ |
| 30 | + dataInsertion(employeeService, departmentService); |
| 31 | + |
| 32 | + |
| 33 | + employeeService.getEmployees().forEach(employe -> { |
| 34 | + System.out.println("********************************************************"); |
| 35 | + System.out.println("Employee info : "); |
| 36 | + System.out.println("Name = " + employe.getName()); |
| 37 | + System.out.println("Email = " + employe.getEmail()); |
| 38 | + System.out.println("Address = " + employe.getAddress()); |
| 39 | + System.out.println("Department = " + employe.getDepartment().getName()); |
| 40 | + System.out.println("Responsibilty = " + employe.getDepartment().getResponsibility()); |
| 41 | + System.out.println("Version = " + employe.getVersion()); |
| 42 | + }); |
| 43 | + |
| 44 | + /*Update Data for audit*/ |
| 45 | + System.out.println("Updating data......"); |
| 46 | + Employee employeeToUpdate = employeeService.getEmployeeById(1); |
| 47 | + long updateTime = System.currentTimeMillis(); |
| 48 | + employeeToUpdate.setName(updateTime + "sanju-updated"); |
| 49 | + employeeService.update(employeeToUpdate.getId(), employeeToUpdate); |
| 50 | + System.out.println("Updating completed."); |
| 51 | + |
| 52 | + /*Delete auditing test*/ |
| 53 | + System.out.println("Deleting data......"); |
| 54 | + List<Employee> employees = employeeService.getEmployees(); |
| 55 | + if(employees.size()>2) { |
| 56 | + Employee employeeToDelete = employees.get(2); |
| 57 | + employeeService.delete(employeeToDelete); |
| 58 | + System.out.println("Data deleted."); |
| 59 | + } |
| 60 | + /*Get all revisions of employee entity*/ |
| 61 | + System.out.println("\n\n\nEmployee Audit data Reading......................................"); |
| 62 | + auditDataRead(Employee.class, configApplicationContext); |
| 63 | + |
| 64 | + System.out.println("\n\n\nDepartment Audit data Reading......................................"); |
| 65 | + auditDataRead(Department.class, configApplicationContext); |
| 66 | + } |
| 67 | + |
| 68 | + private static void dataInsertion(EmployeeService employeeService, DepartmentService departmentService) { |
| 69 | + long currentTime = System.currentTimeMillis(); |
| 70 | + Department department = new Department(); |
| 71 | + department.setName("Development"); |
| 72 | + department.setResponsibility(currentTime + "R&D"); |
| 73 | + Department savedDepartment = departmentService.save(department); |
| 74 | + Employee employee = new Employee(); |
| 75 | + employee.setEmail(currentTime + "@sanju.com"); |
| 76 | + employee.setName("EnversTEST " + currentTime); |
| 77 | + employee.setAddress("EnversAddress " + currentTime); |
| 78 | + employee.setDepartment(savedDepartment); |
| 79 | + employeeService.save(employee); |
| 80 | + } |
| 81 | + |
| 82 | + private static <T> void auditDataRead(Class<T> tClass, AnnotationConfigApplicationContext configApplicationContext) { |
| 83 | + System.out.println("Reading auditing data..."); |
| 84 | + EntityManagerFactory emf = configApplicationContext.getBean(EntityManagerFactory.class); |
| 85 | + AuditReader auditReader = AuditReaderFactory.get(emf.createEntityManager()); |
| 86 | + |
| 87 | + AuditQuery query = auditReader.createQuery() |
| 88 | + .forRevisionsOfEntity(tClass, false, true); |
| 89 | + |
| 90 | + List<Object[]> resultList = query.getResultList(); |
| 91 | + |
| 92 | + resultList.forEach(objects -> { |
| 93 | + System.out.println("------------------------------------------------------------------------\n"); |
| 94 | + if (Employee.class.equals(tClass)) { |
| 95 | + Employee employeeRev = (Employee) objects[0]; |
| 96 | + System.out.println("Employee info : "); |
| 97 | + System.out.println("Id : " + employeeRev.getId()); |
| 98 | + System.out.println("Name : " + employeeRev.getName()); |
| 99 | + System.out.println("Email : " + employeeRev.getEmail()); |
| 100 | + System.out.println("Address : " + employeeRev.getAddress()); |
| 101 | + } else if (Department.class.equals(tClass)) { |
| 102 | + System.out.println("Department info: "); |
| 103 | + Department department = (Department) objects[0]; |
| 104 | + System.out.println("Id : "+department.getId()); |
| 105 | + System.out.println("Responsibility : "+department.getResponsibility()); |
| 106 | + System.out.println("Name : "+department.getName()); |
| 107 | + } |
| 108 | + DefaultRevisionEntity revisionEntity = (DefaultRevisionEntity) objects[1]; |
| 109 | + System.out.println("Revision : " + revisionEntity.getId()); |
| 110 | + System.out.println("Date : " + revisionEntity.getRevisionDate()); |
| 111 | + |
| 112 | + RevisionType revisionType = (RevisionType) objects[2]; |
| 113 | + System.out.println("Operation : " + revisionType.name()); |
| 114 | + }); |
| 115 | + } |
| 116 | +} |
0 commit comments