5. Definition
Hibernate Envers
Hibernate module to enable easy auditing of persistent classes!
Audit = keep a revision of your entity after every "event" (insert,
update, delete)
Available since 2009…
http://www.jboss.org/envers
http://docs.jboss.org/envers/docs/index.html
http://docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html/ch15.html
9. Audit a simple entity class
@Entity
@Audited
public class Person {
@Id @GeneratedValue
private int id;
private String name;
private String surname;
@ManyToOne
private Address address;
// getters, setters, constructors, equals and hashCode…
}
9
10. Some useful Envers @nnotations
@Audited
@AuditTable(“T_PERSON_AUDIT”)
public class Person {
@NotAudited
private String comments;
@AuditJoinTable(name=“T_PERSON_ADDRESS_AUDIT”,
inverseJoinColumns=@JoinColumn(name=“ADDRESS_ID”))
public List<Address> address;
}
10
11. What about the database?
Table T_PERSON
Id Name Surname Comments
Table T_PERSON_AUD 0 Add
Id REV Name Surname REVTYPE 1 Mod
2 Del
Table REVINFO
REV REVTSTMP (additional info)
12. Additional information in revisions
@Entity
@RevisionEntity(UsernameRevisionListener.class)
public class MyEntityRevision extends DefaultRevisionEntity {
private String username; // + getter / setter
}
public class UsernameRevisionListener implements RevisionListener {
@Override
public void newRevision(Object revisionEntity) {
((MyEntityRevision) revisionEntity).setUsername(getCurrentUsername());
}
}
12
13. Tracking modified fields
<property name="org.hibernate.envers.global_with_modified_flag" value="true"/>
Or
@Audited(withModifiedFlag = true)
private String myField;
Table T_PERSON_AUD
Id REV Name Name_MOD Surname Surname_MOD REVTYPE
Still an experimental feature…
15. AuditReader
// Get all the revisions of my current object
int personId = somePerson.getId();
AuditReader auditReader = AuditReaderFactory.get(entityManager);
List<Number> allRevisions = auditReader.getRevisions(Person.class, personId);
for (Number n: allRevisions) {
Person p = auditReader.find(Person.class, personId, n);
System.out.printf("t[Rev #%1$s] > %2$sn", n, p);
}
[Rev #1] > Person { id=10, name='Romain', surname='', comments=''}
[Rev #3] > Person { id=10, name='Romain', surname='Linsolas', comments=''}
[Rev #4] > null
15
21. To summarize…
Pros Cons
Really easy to use! Require Hibernate
Configurable Not compatible with Hibernate XML
Ready-to-use audit query tool configuration (cf. HHH-3887)
Fully integrated in Hibernate
No similar project (?)