Version 3

    Easy to use.

     

    Stick @Auditable on a field that should be auditable.  If the field is annotated with @ManyToOne etc. the cascade type will be read from the annotation (and obeyed) @CollectionOfElements and embedddable objects are cascaded to by default.  Override with cascade attribute on @Auditable.  Lists are compared.

     

    As long as you control your entities through an AuditHome (a drop in replacement for EntityHome) logs will be created.  Two objects are used for logging - the top-level AuditLog (which records Date, User etc. - set these by overriding the methods on AuditHome (create your own extension of AuditHome for your app to set defaukts for these)) and a recusive tree of AuditLogDetail.  Each level maps an object, a new level is created for a 'child' object.