`
13146489
  • 浏览: 251934 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Envers –tracked your Entity Objects

    博客分类:
  • J2EE
阅读更多
原文地址:http://get2java.wordpress.com/2011/06/27/envers-easy-auditing-for-entity-classes/
Have you tracked your Entity Objects ? When it has created,modified and deleted with time.

Try Envers for Easy Auditing of Entity Classes. Very simple to audit your Entity classes using @Audited. Envers now becomes a part of Hibernate 3.5.

List of libraries you need for this

hibernate3.jar
antlr.jar
commons-collections.jar
dom4j-1.6.1.jar
javassist.jar
jpa-api-2.0-1.jar
jta.jar
mysql-connector-java-5.1.3-rc-bin.jar
slf4j-api-1.6.1.jar
1. hibernate.cfg.xml

Add the Audit Event Listeners in your hibernate.cfg.xml

01
<?xml version="1.0" encoding="UTF-8"?>
02
<!DOCTYPE hibernate-configuration PUBLIC
03
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
04
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
05
<hibernate-configuration>
06
<session-factory>
07
<!-- Database connection settings -->
08
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
09
<property name="connection.url">jdbc:mysql://localhost:3306/envers</property>
10
<property name="connection.username">root</property>
11
<property name="connection.password">welcome123</property>
12
<!-- JDBC connection pool (use the built-in) -->
13
<property name="connection.pool_size">1</property>
14
<!-- SQL dialect -->
15
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
16
<!-- Enable Hibernate's automatic session context management -->
17
<property name="current_session_context_class">thread</property>
18
<!-- Disable the second-level cache -->
19
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
20
<!-- Echo all executed SQL to stdout -->
21
<property name="show_sql">true</property>
22
<!-- Drop and re-create the database schema on startup -->
23
<property name="hbm2ddl.auto">update</property>
24
<mapping/>
25
<!-- Hibernate ENVERS Listener Configuration -->
26
<listener class="org.hibernate.envers.event.AuditEventListener" type="post-insert"/>
27
<listener class="org.hibernate.envers.event.AuditEventListener" type="post-update"/>
28
<listener class="org.hibernate.envers.event.AuditEventListener" type="post-delete"/>
29
<listener class="org.hibernate.envers.event.AuditEventListener" type="pre-collection-update"/>
30
<listener class="org.hibernate.envers.event.AuditEventListener" type="pre-collection-remove"/>
31
<listener class="org.hibernate.envers.event.AuditEventListener" type="post-collection-recreate"/>
32
</session-factory>
33
</hibernate-configuration>

2. Entity Class

Your Entity class should have @Audited for tracking the values in the persistent class.

01
package com;
02
import java.io.Serializable;
03
import javax.persistence.Column;
04
import javax.persistence.Entity;
05
import javax.persistence.GeneratedValue;
06
import javax.persistence.Id;
07
import javax.persistence.Table;
08
import org.hibernate.envers.Audited;
09

10
/**
11
* @author Anand
12
*
13
*/
14
@Entity
15
@Table(name="user")
16
@Audited //---------------- This is more important!!!!!!!!
17
public class User implements Serializable {
18
@Id
19
@GeneratedValue
20
@Column(name="id")
21
private int id;
22
@Column(name="firstname")
23
private String firstname;
24
@Column(name="lastname")
25
private String lastname;
26
@Column(name="email")
27
private String email;
28
/**
29
* @return the email
30
*/
31
public String getEmail() {
32
return email;
33
}
34
/**
35
* @param email the email to set
36
*/
37
public void setEmail(String email) {
38
this.email = email;
39
}
40
/**
41
* @return the firstname
42
*/
43
public String getFirstname() {
44
return firstname;
45
}
46
/**
47
* @param firstname the firstname to set
48
*/
49
public void setFirstname(String firstname) {
50
this.firstname = firstname;
51
}
52
/**
53
* @return the id
54
*/
55
public int getId() {
56
return id;
57
}
58
/**
59
* @param id the id to set
60
*/
61
public void setId(int id) {
62
this.id = id;
63
}
64
/**
65
* @return the lastname
66
*/
67
public String getLastname() {
68
return lastname;
69
}
70
/**
71
* @param lastname the lastname to set
72
*/
73
public void setLastname(String lastname) {
74
this.lastname = lastname;
75
}
76
}
3. DB Structure of your Entity class

Field Type Null Key Default Extra
id int(11) NO PRI NULL auto_increment
firstname varchar(128) YES NULL
lastname varchar(128) YES NULL
email varchar(64) YES NULL
4. Insert the data
Now lets begin with Insert the data
Add the data to your Entity Class

1
User user = new User();
2
user.setFirstname("biju");
3
user.setLastname("cd");
4
user.setEmail("cdbiju@gmail.com");
Get the Session Factory and Session to save the data into DB

01
/** Getting the Session Factory and session */
02
//SessionFactory sessionfactory = HibernateUtil.getSessionFactory();
03
SessionFactory sessionfactory = new AnnotationConfiguration().configure().buildSessionFactory();
04
Session sess = sessionfactory.getCurrentSession();
05
/** Starting the Transaction */
06
Trans)action tx = sess.beginTransaction();
07
/** Saving POJO */
08
sess.save(user);
09
/** Commiting the changes */
10
tx.commit();
11
System.out.println("Record Inserted");
12
/** Closing Session */
13
sessionfactory.close();
5. New Tables Created for holding the Revision Entries

Table 1 : user_aud(Audit Table)

Audit table will have the default suffix to be _aud and present in the default schema of the database.
It has the same structure as the Entity table. Additionally it has three columns in it namely

id
REV
REVINFO
Field Type Null Key Default Extra
id int(11) NO PRI NULL auto_increment
REV int(11) NO PRI NULL
REVTYPE tinyint(11) YES
firstname varchar(128) YES NULL
lastname varchar(128) YES NULL
email varchar(64) YES NULL
Table 2 : revinfo(common table for the Entity)

This revinfo table will be common for all the Entity classes.
Field Type Null Key Default Extra
REV int(11) NO PRI NULL auto_increment
REVTSTMP bigint(20) YES
This two tables will be automatically created.
6. Entries in the Audit table and Revinfo table after insert

id REV REVTYPE email firstname lastname
1 1 0 cdbiju@gmail.com biju cd
Here the id column is foreign key for the entity class “user”, REV will be primary key for the audited table. More Importantly the REVTYPE has three values in it.

0 = Creation

1 = Update

2 = Delete

Whenever the insertion takes for the entity class “user”,  it makes an entry as Zero and keeps all the  Audited columns values in it. (0 = Creation)

Look into Revinfo table

REV REVTSTMP
1 134343453534434
It contains the Revision Timestamp value.

7. Update the data and Look into Audit Tables

1
User user = new User();
2
user.setId(1);   // Passes the id=1 to the Entity Class
01
/** Getting the Session Factory and session */
02
SessionFactory sessionfactory = HibernateUtil.getSessionFactory();
03
Session sess = sessionfactory.getCurrentSession();
04
/** Starting the Transaction */
05
Transaction tx = sess.beginTransaction();
06
User u = (User) sess.get(User.class, user.getId());
07
u.setFirstname("biju-append");
08
u.setLastname("cd-append");
09
u.setEmail("cdbiju-append@gmail.com");
10
sess.saveOrUpdate(u);
11
/** Commiting the changes */
12
tx.commit();
13
System.out.println("Record Updated");
14
/** Closing Session */
15
sessionfactory.close();
Look into the Audit Table

id REV REVTYPE email firstname lastname
1 1 0 cdbiju@gmail.com biju Cd
1 2 1 cdbiju-append@gmail.com
biju-append


cd-append


Note 1 is for Update (REVTYPE)

REV REVTSTMP
1 134343453534434
2 134343453534434
When we update the same record, it updates the Audited columns values and update the REVTYPE to be 1.( 1 = Updation)

8. Delete the data and Look into Audit Tables

1
User user = new User();
2
user.setId(1);   // Passes the id=1 to the Entity Class to delete
01
/** Getting the Session Factory and session */
02
SessionFactory sessionfactory = HibernateUtil.getSessionFactory();
03
Session sess = sessionfactory.getCurrentSession();
04
/** Starting the Transaction */
05
Transaction tx = sess.beginTransaction();
06
User u = (User) sess.get(User.class, user.getId());
07
sess.delete(u);
08
/** Commiting the changes */
09
tx.commit();
10
System.out.println("Record Deleted");
11
/** Closing Session */
12
sessionfactory.close();
Look into the Audit Table

id REV REVTYPE email firstname lastname
1 1 0 cdbiju@gmail.com biju Cd
1 2 1 cdbiju-append@gmail.com
biju-append


cd-append


1 3 2 NULL
NULL
NULL
Note 2 is for Delete (REVTYPE)

REV REVTSTMP
1 134343453534434
2 134343453534434
3 134343452343243
When the data is Deleted, the row has been deleted in the Entity table . But in the Audited Table, it updates all the Audited columns to be NULL and updates the REVTYPE to be 2.(2 = Delete)
分享到:
评论

相关推荐

    envers hibernate

    4. **自定义修订实体**:通过实现 `org.hibernate.envers.RevisionEntity` 接口并配置 `hibernate.envers.revision_entity_class`,可以定义包含额外修订信息的自定义实体。 ### 4. 示例代码 ```java @Entity @...

    envers中文文档(部分)

    ### Envers中文文档知识点概述 #### 一、Envers简介 **Envers** 是 **Hibernate** 的一个扩展模块,主要用于实现实体数据的历史版本控制。它的工作原理类似于版本控制系统(如Subversion或Git),通过在数据库中...

    Spring Data Envers API(Spring Data Envers 开发文档).CHM

    Spring Data Envers API(Spring Data Envers 开发文档).CHM 官网 Spring Data Envers API

    hibernate_reference-Hibernate Envers User Guide

    ### Hibernate Envers:简易实体审计指南 #### 一、引言 Hibernate Envers项目旨在为持久化类提供简便的审计功能。用户只需在希望审计的持久化类或其属性上标注`@Audited`注解即可。对于每个被审计的实体,会创建一...

    Hibernate Envers.docx

    Hibernate Envers 是一个强大的审计框架,它与 Hibernate ORM 框架紧密集成,用于记录数据库实体的历史版本。Envers 的主要目标是为应用程序提供数据变更的跟踪,以便于数据恢复、合规性检查以及问题分析。 Envers ...

    hibernate-envers-4.2.4.Final.jar

    hibernate-envers-4.2.4.Final.jar

    Springboot hibernate envers使用过程详解

    在例子中,`User`类是被审计的对象,使用了`@Entity`注解声明为JPA实体,`@Table`指定对应的数据库表名,`@Audited`则表明这个类将被Envers进行审计。`@JsonIgnoreProperties`是为了避免处理懒加载相关的属性,防止...

    JPA配置装载 Jboss Envers Jasperreport ireport 项目

    2. **审计监听器**:在`persistence.xml`中配置Envers的监听器,如`&lt;property name="org.hibernate.envers.audit_table_suffix" value="_AUD"/&gt;`,设置审计表的后缀。 3. **查询历史数据**:使用`AuditReader`来...

    EnversSimpleApp:Envers 上的简单应用

    Envers 上的简单应用程序现有应用程序是在 hibernate 3.5.0 上编写的,数据库连接到 SQL Server(数据库名称“test”)。 DB Config 记录在 hibernate-cfg.xml 中。 envers 的测试是用 HibernateTest.java 编写的

    JPA + Hibernate 3 CRUD操作历史审计日志的解决方案

    这个注解告诉Hibernate Envers模块(一个用于审计的扩展)该实体需要被审计,Envers会自动生成一个审计表来存储历史版本。 接着,为了实现审计日志,我们需要在项目中引入Hibernate Envers的依赖。在Maven的pom.xml...

    hibernate-envers:有机会使用 Envers 对 eXo 的 wiki 实体进行版本控制

    “hibernate-envers:有机会使用 Envers 对 eXo 的 wiki 实体进行版本控制” 暗示我们将讨论如何利用Hibernate Envers这个强大的审计框架,为eXo平台中的wiki实体实现版本管理功能。Envers是Hibernate的一个扩展,...

    jhipster-app-envers

    标题“jhipster-app-envers”指的是一个基于JHipster框架并集成了Envers审计功能的应用程序项目。JHipster是一个开源的开发工具,用于快速生成高质量的Java微服务架构和前端应用。它采用Spring Boot和Angular(或...

    spring-jpa-envers:一个示例项目,用于检查Spring Data对Hibernate Envers的支持

    概述 该应用程序演示了如何将与用于数据库记录的审计和版本控制。执照该示例应用程序及其关联的源代码全部按照以下许可条款提供。 Copyright (C) 2014Permission is hereby granted, free of charge, to any person ...

    envers-validation-maven-plugin:使用Hibernate-envers创建的用于监视审核历史记录验证的Maven插件

    envers-validation-maven-plugin 这是一个Maven插件,用于验证由hibernate-envers生成/管理的审核修订的结构和内容。 此插件对表结构或内容并非始终由Envers生成的数据库特别有用。 例如,在数据库中,DBA有时会...

    hibernate-envers-5.3.10.Final.jar

    java运行依赖jar包

    hibernate-envers-demo:使用Hibernate Envers,Spring Boot和AngularJS的简短演示

    Hibernate启用演示问题陈述这是一个使用Hibernate Envers,Spring boot和AngularJS的演示项目。 它旨在作为称为“四眼原理”( )的实际用例的解决方案。 此用例的主要参与者是“制造者”和“检查者”。 第一个将对...

    test-delete:测试Spring Boot App以显示带有CRUDRepository的Envers和Bug

    在本项目中,我们关注的是一个名为"test-delete"的Spring Boot应用,它涉及到使用CRUDRepository和Hibernate Envers进行数据库操作,特别是针对数据的创建、读取、更新和删除(CRUD)功能。让我们深入探讨一下这个...

    hibernate3参考资料

    **Hibernate Envers 用户指南中文版** Hibernate 是一个流行的开源对象关系映射(ORM)框架,它使得Java开发者能够更方便地在关系型数据库上操作对象。而Hibernate Envers 是 Hibernate 的一个扩展,专注于数据审计...

    gw-data-jpa-envers

    该项目是项目的扩展,允许访问由Hibernate Envers管理的实体修订版。 来源主要来自PhilippHügelmeyer 的贡献。 该模块的核心功能包括Spring Data Commons的RevisionRepository的实现。 public interface ...

    hibernate-envers-sample

    用法如果您想运行项目,则只需运行SampleDataJpaApplication中的主方法。 该项目包括一个H2控制台,因此您可以在任何浏览器上查看您的数据库。 尝试: 转到 在登录表单中,请添加以下信息: JDBC URL:jdbc:h2:mem...

Global site tag (gtag.js) - Google Analytics