Skip to content

Commit 99a84fe

Browse files
author
sanjoy
committed
[refs #1] - Initial commit
1 parent 81d0e75 commit 99a84fe

File tree

11 files changed

+646
-0
lines changed

11 files changed

+646
-0
lines changed

pom.xml

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
7+
<groupId>HibernateEnversExample</groupId>
8+
<artifactId>envers</artifactId>
9+
<version>1.0-SNAPSHOT</version>
10+
<build>
11+
12+
<plugins>
13+
<plugin>
14+
<groupId>org.apache.maven.plugins</groupId>
15+
<artifactId>maven-compiler-plugin</artifactId>
16+
<configuration>
17+
<source>1.8</source>
18+
<target>1.8</target>
19+
</configuration>
20+
</plugin>
21+
<plugin>
22+
<groupId>org.apache.maven.plugins</groupId>
23+
<artifactId>maven-assembly-plugin</artifactId>
24+
<executions>
25+
<execution>
26+
<phase>package</phase>
27+
<goals>
28+
<goal>single</goal>
29+
</goals>
30+
<configuration>
31+
<archive>
32+
<manifest>
33+
<mainClass>
34+
Application
35+
</mainClass>
36+
</manifest>
37+
</archive>
38+
<descriptorRefs>
39+
<descriptorRef>jar-with-dependencies</descriptorRef>
40+
</descriptorRefs>
41+
</configuration>
42+
</execution>
43+
</executions>
44+
</plugin>
45+
</plugins>
46+
</build>
47+
<dependencies>
48+
49+
<dependency>
50+
<groupId>org.springframework</groupId>
51+
<artifactId>spring-core</artifactId>
52+
<version>5.1.4.RELEASE</version>
53+
</dependency>
54+
55+
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
56+
<dependency>
57+
<groupId>org.springframework</groupId>
58+
<artifactId>spring-context</artifactId>
59+
<version>5.1.4.RELEASE</version>
60+
</dependency>
61+
<!-- https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client -->
62+
<dependency>
63+
<groupId>org.mariadb.jdbc</groupId>
64+
<artifactId>mariadb-java-client</artifactId>
65+
<version>2.4.0</version>
66+
</dependency>
67+
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
68+
<dependency>
69+
<groupId>org.springframework</groupId>
70+
<artifactId>spring-aspects</artifactId>
71+
<version>5.1.4.RELEASE</version>
72+
</dependency>
73+
74+
75+
<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
76+
<dependency>
77+
<groupId>org.springframework</groupId>
78+
<artifactId>spring-tx</artifactId>
79+
<version>5.1.4.RELEASE</version>
80+
</dependency>
81+
82+
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
83+
<dependency>
84+
<groupId>org.springframework</groupId>
85+
<artifactId>spring-jdbc</artifactId>
86+
<version>5.1.4.RELEASE</version>
87+
</dependency>
88+
89+
<!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-jpa -->
90+
<dependency>
91+
<groupId>org.springframework.data</groupId>
92+
<artifactId>spring-data-jpa</artifactId>
93+
<version>2.1.4.RELEASE</version>
94+
</dependency>
95+
96+
<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
97+
<dependency>
98+
<groupId>org.springframework</groupId>
99+
<artifactId>spring-tx</artifactId>
100+
<version>5.1.4.RELEASE</version>
101+
</dependency>
102+
103+
<dependency>
104+
<groupId>org.hibernate</groupId>
105+
<artifactId>hibernate-envers</artifactId>
106+
<version>5.4.0.Final</version>
107+
</dependency>
108+
<!-- https://mvnrepository.com/artifact/javax.persistence/javax.persistence-api -->
109+
<dependency>
110+
<groupId>javax.persistence</groupId>
111+
<artifactId>javax.persistence-api</artifactId>
112+
<version>2.2</version>
113+
</dependency>
114+
115+
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
116+
<dependency>
117+
<groupId>org.hibernate</groupId>
118+
<artifactId>hibernate-core</artifactId>
119+
<version>5.4.0.Final</version>
120+
</dependency>
121+
122+
123+
<dependency>
124+
<groupId>com.h2database</groupId>
125+
<artifactId>h2</artifactId>
126+
<version>1.4.196</version>
127+
</dependency>
128+
129+
<dependency>
130+
<groupId>junit</groupId>
131+
<artifactId>junit</artifactId>
132+
<version>4.12</version>
133+
</dependency>
134+
135+
</dependencies>
136+
137+
138+
</project>
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
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+
}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package com.sanju.envers.config;
2+
3+
import org.h2.Driver;
4+
import org.hibernate.boot.SchemaAutoTooling;
5+
import org.hibernate.cfg.AvailableSettings;
6+
import org.hibernate.dialect.MariaDB10Dialect;
7+
import org.springframework.context.annotation.Bean;
8+
import org.springframework.context.annotation.ComponentScan;
9+
import org.springframework.context.annotation.Configuration;
10+
import org.springframework.core.task.TaskExecutor;
11+
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
12+
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
13+
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
14+
import org.springframework.jdbc.datasource.DriverManagerDataSource;
15+
import org.springframework.jdbc.datasource.SimpleDriverDataSource;
16+
import org.springframework.orm.jpa.JpaTransactionManager;
17+
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
18+
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
19+
import org.springframework.scheduling.annotation.EnableAsync;
20+
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
21+
import org.springframework.transaction.PlatformTransactionManager;
22+
import org.springframework.transaction.annotation.EnableTransactionManagement;
23+
24+
import javax.persistence.SharedCacheMode;
25+
import javax.persistence.ValidationMode;
26+
import javax.sql.DataSource;
27+
import java.util.Map;
28+
import java.util.Properties;
29+
30+
@Configuration
31+
@ComponentScan(basePackages = {"com.sanju.envers","com.sanju.envers.repository"})
32+
@EnableTransactionManagement
33+
@EnableJpaRepositories(entityManagerFactoryRef = "emf",basePackages = {"com.sanju.envers.repository"})
34+
@EnableAsync
35+
@EnableJpaAuditing
36+
public class AppConfig {
37+
38+
@Bean
39+
public DataSource dataSource() {
40+
DriverManagerDataSource dataSource = new DriverManagerDataSource();
41+
dataSource.setDriverClassName("org.mariadb.jdbc.Driver");
42+
dataSource.setUrl("jdbc:mysql://localhost:3306/envers_practice?autoReconnect=true");
43+
dataSource.setUsername("root");
44+
dataSource.setPassword("root");
45+
return dataSource;
46+
}
47+
48+
@Bean
49+
public LocalContainerEntityManagerFactoryBean emf(){
50+
HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
51+
adapter.setDatabasePlatform("org.hibernate.dialect.MariaDB10Dialect"); //you can change this if you have a different DB
52+
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
53+
54+
Properties properties = new Properties();
55+
properties.put("hibernate.dialect", MariaDB10Dialect.class);
56+
properties.put(AvailableSettings.HBM2DDL_AUTO, SchemaAutoTooling.UPDATE.name().toLowerCase());
57+
properties.put(AvailableSettings.SHOW_SQL,"true");
58+
properties.put("org.hibernate.envers.audit_table_suffix",
59+
"_aud");
60+
factory.setJpaProperties(properties);
61+
factory.setJpaVendorAdapter(adapter);
62+
factory.setDataSource(dataSource());
63+
factory.setPackagesToScan("com.sanju.envers");
64+
factory.setSharedCacheMode(SharedCacheMode.ENABLE_SELECTIVE);
65+
factory.setValidationMode(ValidationMode.NONE);
66+
return factory;
67+
}
68+
69+
@Bean
70+
public PlatformTransactionManager transactionManager()
71+
{
72+
return new JpaTransactionManager(
73+
this.emf().getObject());
74+
}
75+
76+
@Bean
77+
public TaskExecutor threadPoolTaskExecutor() {
78+
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
79+
executor.setCorePoolSize(25);
80+
executor.setMaxPoolSize(30);
81+
executor.setThreadNamePrefix("default_task_executor_thread");
82+
executor.initialize();
83+
return executor;
84+
}
85+
}

0 commit comments

Comments
 (0)