Its quite common when you create an application, there is a need to create an audit trail on the application level where all entity insert, update and delete events are logged.
In this post, I would like to describe a simple approach that can help you to avoid littering with unnecessary statements in your application code. The solution is to register a class as a listener on Hibernate events. Once class is triggered, you will be able to write audit information to a database or log file.
The following shows a Hibernate event interceptor class that is triggered when persistent entity is inserted, deleted or updated.
public class HibernateEventInterceptor implements PostInsertEventListener,
PostUpdateEventListener,
PostDeleteEventListener,
Initializable {
public HibernateEventInterceptor() {
}
public void initialize(Configuration cfg) {
}
public void onPostInsert(PostInsertEvent event) {
String entityName = event.getPersister().getEntityName();
System.out.println("Inserted entity: " + entityName);
}
public void onPostUpdate(PostUpdateEvent event) {
String entityName = event.getPersister().getEntityName();
System.out.println("Updated entity: " + entityName);
}
public void onPostDelete(PostDeleteEvent event) {
String entityName = event.getPersister().getEntityName();
System.out.println("Deleted entity: " + entityName);
}
}
The following shows extra configuration that must be added to persistence.xml, in order for the interceptor class to be triggered:
<persistence> <persistence-unit name="org.example.demo"> <jta-data-source>java:/test</jta-data-source> <properties> . . . <property name="hibernate.ejb.event.post-insert" value="org.example.demo.HibernateEventInterceptor"/> <property name="hibernate.ejb.event.post-update" value="org.example.demo.HibernateEventInterceptor"/> <property name="hibernate.ejb.event.post-delete" value="org.example.demo.HibernateEventInterceptor"/> </properties> </persistence-unit> </persistence>